我的数据集如下:
time Open
2017-01-01 00:00:00 1.219690
2017-01-01 01:00:00 1.688490
2017-01-01 02:00:00 1.015285
2017-01-01 03:00:00 1.357672
2017-01-01 04:00:00 1.293786
2017-01-01 05:00:00 1.040048
2017-01-01 06:00:00 1.225080
2017-01-01 07:00:00 1.145402
...., ....
2017-12-31 23:00:00 1.145402
我想在指定的sum
之间找到time-range
并将其保存到新的dataframe
。
假设
2017-01-01 22:00:00
和2017-01-02 04:00:00
之间的总和。这是两天之间6
小时的总和。我想在sum
之类的time-range
中找到10 PM
到第二天4 AM
的数据,并将其放在另一个data frame
中,例如{{ 1}}。请注意,我们正在2个不同的日期进行df_timerange_sum
中的sum
吗?我做了什么?
time
来计算sum()
,如下所示:time-range
但它给了我df[~df['time'].dt.hour.between(10, 4)].sum()
整个sum
,但没有给{ {1}} df
我已指定。between
,但我找不到为time-range
做这件事的方法答案 0 :(得分:0)
df['time'].dt.hour.between(10, 4)
始终为False
,因为同时没有数字大于10
且小于4
。您要标记between(4,21)
,然后取反以获取其他小时数。
这就是我要做的:
# mark those between 4AM and 10PM
# data we want is where s==False, i.e. ~s
s = df['time'].dt.hour.between(4, 21)
# use s.cumsum() marks the consecutive False block
# on which we will take sum
blocks = s.cumsum()
# again we only care for ~s
(df[~s].groupby(blocks[~s], as_index=False) # we don't need the blocks as index
.agg({'time':'min', 'Open':'sum'}) # time : min -- select the beginning of blocks
) # Open : sum -- compute sum of Open
输出随机数据:
time Open
0 2017-01-01 00:00:00 1.282701
1 2017-01-01 22:00:00 2.766324
2 2017-01-02 22:00:00 2.838216
3 2017-01-03 22:00:00 4.151461
4 2017-01-04 22:00:00 2.151626
5 2017-01-05 22:00:00 2.525190
6 2017-01-06 22:00:00 0.798234
答案 1 :(得分:0)
完成同一件事的另一种方法(在我看来更简单)..肯定有减少代码的方法,但我对熊猫还比较陌生
df.set_index(['time'],inplace=True) #make time the index col (not 100% necessary)
df2=pd.DataFrame(columns=['start_time','end_time','sum_Open']) #new df that stores your desired output + start and end times if you need them
df2['start_time']=df[df.index.hour == 22].index #gets/stores all start datetimes
df2['end_time']=df[df.index.hour == 4].index #gets/stores all end datetimes
for i,row in df2.iterrows():
df2.set_value(i,'sum_Open',df[(df.index >= row['start_time']) & (df.index <= row['end_time'])]['Open'].sum())
您必须添加if语句或其他内容来处理截至晚上11点的最后一天。