亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

熊貓:如何用時間開始和結束匯總每小時計數

熊貓:如何用時間開始和結束匯總每小時計數

炎炎設計 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 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號