2 回答

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

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)
添加回答
舉報