Python 熊猫:如何将每小时计数与时间开始和结束相加

Python 熊猫:如何将每小时计数与时间开始和结束相加,python,pandas,Python,Pandas,我有一个数据帧,其中包含每个唯一评级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点结束。因此

我有一个数据帧,其中包含每个唯一评级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次计数

我想输出一个每小时汇总表,如下所示

我一直在想一个解决办法


任何帮助都将不胜感激!谢谢大家!

您可以将小时开始列和结束列都转换为日期时间。然后计算时间差。最后,将时差转换为小时差(秒除以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
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
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
更新:

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
输出:

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
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
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

IIUC,您可以这样使用
pd.to\u datetime
pd.date\u 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)
或者,使用
分解
值\u计数

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)

好问题,但你需要澄清一些假设。例如:1。这两列是否保证就它们所代表的绝对时间而言是单调的?2.当一列中的某个数字低于前一个数字时,是否可以保证这意味着时间正好晚了一天?@timgeb感谢您的回复。1.是的,两列都是。2.是的,如果小时结束时间低于小时开始时间,则意味着它将在第二天结束。@C4TNT我看到你编辑了这篇文章,那么计算小时总结表背后的逻辑是什么?@ShubhamSharma很抱歉,我说得不够清楚。让我打个比方。我每小时玩很多老虎机。我想知道每小时玩多少台机器。但是我只有每台机器的开始和结束时间。非常感谢!这就是我想要输出的!