我有一个数据框,每天从7:00开始,到22:10结束,间隔为5分钟。
在df中大约有200天(周末和某些特定日期除外)
Date Time Volume
0 2019-09-03 07:00:00 70000 778
1 2019-09-03 07:05:00 70500 1267
2 2019-09-03 07:10:00 71000 1208
3 2019-09-03 07:15:00 71500 715
4 2019-09-03 07:20:00 72000 372
我需要另一列,我们将其称为“ lastdayVolume”,其中包含前一天的Volume的最大值
例如,在2019-09-03(7:00和22:10之间)中,单行的最大交易量值为50000,那么我需要在2019-09-04的每一行中'lastdayVolume'列中的值50000 。
您如何在不降低数据框长度的情况下执行此操作?
答案 0 :(得分:1)
您尝试过
df.resample('1D', on='Date').max()
这应该每天给您一行,并在这一天达到最大值。
编辑:要将其与旧数据结合起来,可以使用左连接。有点混乱,但是
pd.merge(df, df.resample('1D', on='Date')['Volume'].max().rename('lastdayVolume'), left_on=pd.to_datetime((df['Date'] - pd.Timedelta('1d')).dt.date), right_index=True, how='left')
In [54]: pd.merge(df, df.resample('1D', on='Date')['Volume'].max().rename('lastdayVolume'), left_on=pd.to_datetime((df['Date'] - pd.Timedelta('1d')).dt.date), right_index=True, how='left')
Out[54]:
Date Time Volume lastdayVolume
0 2019-09-03 07:00:00 70000 778 800.0
1 2019-09-03 07:05:00 70500 1267 800.0
2 2019-09-03 07:10:00 71000 1208 800.0
3 2019-09-03 07:15:00 71500 715 800.0
4 2019-09-03 07:20:00 72000 372 800.0
0 2019-09-02 08:00:00 70000 800 NaN
似乎正在锻炼。
等效地,您可以使用稍短的
df.join(df.resample('1D', on='Date')['Volume'].max().rename('lastdayVolume'), on=pd.to_datetime((df['Date'] - pd.Timedelta('1d')).dt.date))
这里。
第一个DataFrame是您的旧数据框架,第二个是我上面计算出的数据框架(带有适当的重命名)。要使这些值合并,请使用包含时间戳记的'Date'
列,将其偏移一天,然后转换为左侧的实际日期。在右侧,只需使用索引。
左联接确保您不会在前一天没有事务的情况下意外删除行。
编辑2:要找出特定时间范围内的最大值,您可以使用
df.set_index('Date').between_time('15:30:00', '22:10:00')
过滤DataFrame。然后像以前一样重新采样
df.join(df.set_index('Date').between_time('15:30:00', '22:10:00').resample('1D')...
随着日期进入索引,不再需要重采样中的on
参数。