Как сгруппировать в течение интервала времени и создать новый столбец с тегом, тэг увеличивается при повторении периода времени? - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь сгруппировать набор строк между определенным периодом времени, когда в дате есть переход.Например, я пытаюсь сэмплировать строки, начиная с 1-1-2019 с 23:00:00 до 1-2-2019 4:00:00, и в течение этого диапазона создаю новый столбец с тегом, в котором тег увеличиваетсякогда период времени повторяется.Кроме того, я намереваюсь извлечь максимальное значение в столбце «High» и создать новый столбец «Max_high», аналогично минимальному значению в столбце «Low» и создать новый «Min_low». «Код 1»

Данные представляют собой временные ряды, которые выбираются с интервалом 5 минут.

Мне удалось извлечь значения max_high и min_low 'High' и 'Low' с помощью Iloc и вручную проиндексировать фрейм данных, но я хочуони вставляются в виде столбца в один и тот же фрейм данных."Code2"

Я пробовал функцию между_темпами () и там, где запрос панд и numpy от меня, кажется, не получить то, что я хочу.

Чего мне не хватает?

Пример данных



              Date   Time     Open     High      Low    Close    Up  Down
0        05/18/2004  18:05  1090.75  1091.00  1090.75  1091.00    39     9
1        05/18/2004  18:10  1091.00  1091.00  1090.75  1091.00    23     2
2        05/18/2004  18:15  1091.00  1091.00  1090.75  1090.75    55    24
3        05/18/2004  18:20  1091.00  1091.00  1090.75  1090.75    61   458
4        05/18/2004  18:25  1090.75  1091.00  1090.50  1090.50     1    93
5        05/19/2004  00:00  1096.50  1096.50  1096.25  1096.25    11    10
6        05/19/2004  00:05  1096.25  1096.75  1096.25  1096.75    44    10
7        05/19/2004  00:10  1096.75  1096.75  1096.25  1096.50    15    133
8        05/19/2004  00:15  1096.50  1096.50  1096.25  1096.50    16    4

Ожидаемый результат

         Date        Time   Open     High      Low     Close      Up  Down  /
0        05/18/2004  18:05  1090.75  1091.00  1090.75  1091.00    39     9
1        05/18/2004  18:10  1091.00  1091.00  1090.75  1091.00    23     2
2        05/18/2004  18:15  1091.00  1091.00  1090.75  1090.75    55    24
3        05/18/2004  18:20  1091.00  1091.00  1090.75  1090.75    61   458
4        05/18/2004  18:25  1090.75  1091.00  1090.50  1090.50     1    93
5        05/19/2004  00:00  1096.50  1096.50  1096.25  1096.25    11    10
6        05/19/2004  00:05  1096.25  1096.75  1096.25  1096.75    44    10
7        05/19/2004  00:10  1096.75  1096.75  1096.25  1096.50    15    133
8        05/19/2004  00:15  1096.50  1096.50  1096.25  1096.50    16    4

/  Max_high   Min_low
    1096.75    1090.75
    1096.75    1090.75
    1096.75    1090.75
    1096.75    1090.75
    1096.75    1090.75
    1096.75    1090.75
    1096.75    1090.75
    1096.75    1090.75

Код 1:

import pandas as pd 
import numpy as np

data_df = pd.read_csv("data.csv")
data_df['Datetime'] = pd.to_datetime(data_df['Date'] + ' ' + data_df['Time'])
data_df = data_df.set_index('Datetime')
data_df_adv = data_df.drop(['Up','Down'],axis = 1)
data_df_adv['label'] = data_df_adv['Time'].apply(lambda x : 'time1' if x >= '09:00:00' and x < '16:00:00' else 'time2')
data_df_adv['max_high'] = data_df_adv.groupby(['Date','label'])['High'].transform(max)

Код выхода 1:

                           Date   Time     Open     High      Low    Close  \
Datetime                                                                     
2004-05-18 18:05:00  05/18/2004  18:05  1090.75  1091.00  1090.75  1091.00   
2004-05-18 18:10:00  05/18/2004  18:10  1091.00  1091.00  1090.75  1091.00   

                     label  max_high  label_low  
Datetime                                         
2004-05-18 18:05:00  time2   1097.25    1090.25  
2004-05-18 18:10:00  time2   1097.25    1090.25  

Код 2:

import pandas as pd
import math

def dateparse(d,t):
    dt = d + " " + t
    return pd.datetime.strptime(dt, '%m/%d/%Y %H:%M')

final_data=[]
dt= pd.read_csv('data.csv',parse_dates=[['Date','Time']])

start_date  = dt['Date_Time'].iloc[0]
start_year  = dt['Date_Time'].iloc[0].year
start_month = dt['Date_Time'].iloc[0].month
end_date    = dt['Date_Time'].iloc[-1]
end_year    = dt['Date_Time'].iloc[-1].year
end_month   = dt['Date_Time'].iloc[-1].month

count = 1
count1 = 1
for y in range(int(start_year),int(end_year)+1):
    for m in range(int(start_month),int(end_month)+1):
        for d in range(1,31):
            st_d = format(y,'04d')+"-"+format(m,'02d')+"-"+format(d,'02d')
            st_dt = format(y,'04d')+"-"+format(m,'02d')+"-"+format(d,'02d')+" 16:00:00"
            ed_dt = format(y,'04d')+"-"+format(m,'02d')+"-"+format(int(d+1),'02d')+" 09:30:00"
            df = dt[(dt['Date_Time'] >= st_dt) & (dt['Date_Time'] < ed_dt)]
            if(not math.isnan(df['High'].max())):
                final_data.append(["period"+str(count), str(df['High'].max()), str(df['Low'].min())])
            if(dt.between_time('16:00','9:00')):
                dt['period'] = "period"+str(count)
            else:
                dt['period'] = "period0"

df1=pd.DataFrame(final_data)

Код выхода 2:

0   period18    1100.25 1090.25
1   period19    1090.0  1084.25
2   period20    1099.75 1088.75
3   period21    1094.0  1092.25
4   period23    1101.25 1092.75
5   period24    1098.75 1090.25
6   period25    1113.75 1108.75
7   period26    1119.5  1113.75
8   period27    1123.75 1118.75
9   period28    1123.25 1120.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...