Как вставить цифры в порядке возрастания в столбце в pandas? - PullRequest
0 голосов
/ 08 апреля 2020

Итак, у меня есть такой фрейм данных, в котором есть столбцы Date, OHL C, volume и OI. Я хочу вставить новый столбец «число» и перед открытием рынка, т.е. 09:15:00, я хочу, чтобы в этой строке было «1», а затем число должно увеличиваться на 1 с каждой увеличивающейся строкой до следующего открытия рынка. В основном я хочу получить индекс 15-минутного таймфрейма для дня.

    Date                 Open    High   Low      Close  volume    oi    
0   2020-03-31 10:55:00 177.00  177.00  177.00  177.00  0          0    
1   2020-03-31 11:05:00 177.00  177.00  177.00  177.00  0          0    
2   2020-03-31 11:15:00 177.00  179.50  170.00  179.50  150        75   
3   2020-03-31 11:25:00 188.00  188.00  188.00  188.00  75        225   
4   2020-03-31 11:35:00 188.00  189.60  185.00  189.60  150       300   
... ... ... ... ... ... ... ... ...
137 2020-04-07 14:45:00 164.20  171.15  153.00  168.75  459000  665025  
138 2020-04-07 14:55:00 167.05  187.85  157.00  183.85  677250  599100  
139 2020-04-07 15:05:00 183.80  185.60  171.85  182.75  490575  586275  
140 2020-04-07 15:15:00 182.20  182.35  169.00  172.50  352725  533475  
141 2020-04-07 15:25:00 172.45  180.00  166.25  180.00  155625  521775  

Я попробовал этот код.

df['Date'] = df['Date'].astype(str)
df['number'] = ''
for i in df.index:
    if i == 1:
        if '09:15:00' in df['Date'][i]:
            df['number'][i] = 1
            if '09:15:00' not in df['Date'][i]:
                df['number'][i] = df['number'][i-1] + 1

Этот код ничего не дает. Номер столбца остается пустым после использования вышеуказанного кода

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Привет, не говоря о чистоте того, как это можно сделать следующим образом:

import pandas as pd
data =[['2020-03-31 10:55:00', '177.00',  '177.00',  '177.00',  '177.00',  '0', '0'],
       ['2020-03-31 11:05:00', '177.00',  '177.00',  '177.00' , '177.00', '0',          '0' ],   
   ['2020-03-31 11:15:00', '177.00' , '179.50',  '170.00',  '179.50'  ,'150','75'   ],
   ['2020-03-31 11:25:00','188.00' ,'188.00' , '188.00','188.00','75' ,       '225'   ],
   ['2020-03-31 11:35:00', '188.00',  '189.60','185.00','189.60','150','300' ],
   ['2020-04-01 09:15:00', '188.00',  '189.60','185.00','189.60','150','300' ]
   ]


# Create the pandas DataFrame 
df = pd.DataFrame(data, columns = [ 'Date','Open','High','Low','Close','volume','oi']) 

#insert column
df.insert(1, 'number',0)
from datetime import datetime
pre_number = 0
for index, row in df.iterrows():
  time = datetime.strptime(row['Date'].split(" ")[1], '%H:%M:%S')
  if(row['Date'].split(" ")[1] == '09:15:00'):
    pre_number = 1
  else:
    pre_number +=1
  df.loc[index,'number']=pre_number

df

Я предполагаю, что большая часть данных представлена ​​в виде строки. Я не удосужился перевести их в формат даты. Но вставка столбца со значением по умолчанию и итерация в соответствии с вашим целевым временем, исключая часть даты, поможет вам вставить правильные данные

0 голосов
/ 08 апреля 2020

Ваш l oop проверяет только, если i == 1 и, если это так, если '09:15:00' in df['Date'][i]. Так как это значение не в df['Date'][i], ничего не происходит.

В качестве отступления, вы просто хотите перебирать фрейм данных таким способом, как последнее средство. Вы должны быть в состоянии достичь sh того же результата, используя стандартные pandas соглашения и типы данных. Поэтому не конвертируйте «Дата» в строку (сохраните ее как datetime64 и используйте функции pandas на полную мощность.

df = df.sort_values('Date')
df['day'] = df['Date'].dt.date
df['number'] = df.groupby('day').rank(method='first')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...