为了账号安全,请及时绑定邮箱和手机立即绑定

熊猫:如何用时间开始和结束汇总每小时计数

熊猫:如何用时间开始和结束汇总每小时计数

炎炎设计 2022-12-06 15:12:38
我有一个数据框,其中包含每个唯一评级 ID 的开始和结束时间。d={'ID':['01','02','03','04','05','06'],'Hour Start':[5,9,13,15,20,23],'Hour End':[6,9,15,19,0,2]} df=pd.DataFrame(data=d)我的目标是汇总整个数据集每小时活跃的评级数量。例如,ID:01 在早上 5 点和早上 6 点开始。那么早上 5 点和早上 6 点都应该各加 1 个计数。但是对于ID:06,评分从晚上11点开始,到次日凌晨2点结束。因此,从晚上 11 点到凌晨 2 点,每小时应该增加 1 个计数。我想输出一个如下所示的每小时摘要表。我一直在思考解决方案。任何帮助将不胜感激!谢谢 !
查看完整描述

2 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

您可以将小时开始和结束列都转换为日期时间。然后你计算时间差。最后,将时差转换为小时差(将秒除以 3600):


df['Hours_s'] = pd.to_datetime(df['Hour Start'], format='%H' )

df['Hours_e'] = pd.to_datetime(df['Hour End'], format='%H' )

df['delta'] = df['Hours_e']-df['Hours_s']

df["count"] = df["delta"].apply(lambda x: x.seconds//3600)

输出:


ID   Hour_Start Hour_End count

0          5       6       1

1          9       9       0

2          13      15      2

3          15      19      4

4          20      0       4

5          23      2       3

更新:


final_tab = pd.DataFrame({"Hour": range(0,24), "Count": [0]*24})


for i, row in df.iterrows():

    if row["delta"].days != 0:

        final_tab.iloc[row["Hour Start"]:24,1] =final_tab.iloc[row["Hour Start"]:24,1] +1

        final_tab.iloc[0:row["Hour End"]+1,1] =final_tab.iloc[0:row["Hour End"]+1,1] +1

    else:

        final_tab.iloc[row["Hour Start"]:row["Hour Start"]+row["count"],1] = final_tab.iloc[row["Hour Start"]:row["Hour Start"]+row["count"],1] + 1

输出:


print(final_tab)

   Hour Count

0   0   2

1   1   1

2   2   1

3   3   0

4   4   0

5   5   1

6   6   1

7   7   0

8   8   0

9   9   1

10  10  0

11  11  0

12  12  0

13  13  1

14  14  1

15  15  2

16  16  1

17  17  1

18  18  1

19  19  1

20  20  1

21  21  1

22  22  1

23  23  2


查看完整回答
反对 回复 2022-12-06
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

pd.to_datetimeIIUC,您可以使用and这样做pd.date_range:


#Convert hours to datetime

df['endTime'] = pd.to_datetime(df['Hour End'], format='%H')

df['startTime'] = pd.to_datetime(df['Hour Start'], format='%H')


#If 'Hour End' less thn 'Hour Start' assume next day

df['endTime'] = np.where(df['Hour End'] < df['Hour Start'], 

                         df['endTime']+pd.Timedelta(days=1), 

                         df['endTime'])


#Create a series of hours per defined ranges ('Hour Start' to 'Hour End')

df_hourly = df.apply(lambda x: pd.Series(pd.date_range(x['startTime'], 

                                                       x['endTime'], 

                                                       freq='H')), 

                                         axis=1)\

              .stack().dt.hour


#Use value counts to count the hours and reindex to 24-hour day to fill missing hours.

df_hourly.value_counts().reindex(np.arange(0,24)).fillna(0).astype(int)

输出:


0     2

1     1

2     1

3     0

4     0

5     1

6     1

7     0

8     0

9     1

10    0

11    0

12    0

13    1

14    1

15    2

16    1

17    1

18    1

19    1

20    1

21    1

22    1

23    2

或者,使用explode和value_counts:


df.apply(lambda x: pd.date_range(x['startTime'], 

                                 x['endTime'], 

                                 freq='H'), axis=1)\

  .explode().dt.hour.value_counts()\

  .reindex(np.arange(0,24), fill_value=0)


查看完整回答
反对 回复 2022-12-06
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号