Python 熊猫:如何将每小时计数与时间开始和结束相加
我有一个数据帧,其中包含每个唯一评级ID的开始和结束时间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点结束。因此
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很抱歉,我说得不够清楚。让我打个比方。我每小时玩很多老虎机。我想知道每小时玩多少台机器。但是我只有每台机器的开始和结束时间。非常感谢!这就是我想要输出的!