使用熊猫计算固定时间范围之间的总和

时间:2019-07-17 01:20:40

标签: python python-3.x pandas dataframe

我的数据集如下:

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:002017-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做这件事的方法

2 个答案:

答案 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点的最后一天。