我的資料集如下所示:
main_id time_stamp
aaa 2019-05-29 08:16:05 05
aaa 2019-05-30 00:11:05 05
aaa 2020-05-30 09:15:07 05
bbb 2019-05-29 09:11:05 05
對于每個main_id,我想:
a) 按升序對 time_stamps 進行排序
b) 我想創建一個新列day,它使用 time_stamp 推匯出一個描述作業日的數字。
作業日定義如下:
周一 05:00 - 周二 01:00(1 個作業日,即周一)
周二 05:00 - 周三 01:00 =>(1 個作業日,即周二)
等等...
第一行和第二行main_id = aaa來自同一個作業日,因為第二行顯示的是第二天凌晨 1 點之前的時間。因此,這是第一個作業日,該day專欄將有1.
但是,在第三行中,時間戳來自另一個作業日,因此我們將其添加2為day.
最終結果可能如下所示:
main_id time_stamp day
aaa 2019-05-29 08:16:05 05 1
aaa 2019-05-30 00:11:05 05 1
aaa 2020-05-30 09:15:07 05 2
bbb 2019-05-29 09:11:05 05 1
第 1 天將在第一個 5:00 am 之間的任何地方 - 第二天的 1 am。第 2 天將是下一個可能的作業日(下一個 5 點 - 1 點)
我怎樣才能做到這一點?
df = df.sort_values('vehicle_id')
uj5u.com熱心網友回復:
一個簡單的方法是減去 5 小時,然后按排序日期分組以獲得組號:
df['time_stamp'] = pd.to_datetime(df['time_stamp'])
s = df['time_stamp'].sub(pd.Timedelta('5h'))
df['day'] = df.groupby(s.dt.date).ngroup().add(1)
注意。您實際上不需要對值進行排序groupby,默認情況下對值進行排序。
每個“main_id”應用的變體:
df['day'] = (df.groupby('main_id')
.apply(lambda d: d.groupby(s.dt.date).ngroup().add(1)).droplevel(0)
)
輸出:
main_id time_stamp day
0 aaa 2019-05-29 08:16:05 05:00 1
1 aaa 2019-05-30 00:11:05 05:00 1
2 aaa 2020-05-30 09:15:07 05:00 2
3 bbb 2019-05-29 09:11:05 05:00 1
uj5u.com熱心網友回復:
- 為了按升序對時間戳進行排序,請執行以下操作:
#Let's say the dataframe is df
df['time_stamp'] = pd.to_datetime(df['time_stamp'])
df.sort_values(by='time_stamp')
- 對于作業日的第一天,我會這樣做:
day1= #add the end of the first businesss date, like: 2019-05-30 01:00
df['day']=1
for i in df.index:
df['day'].iloc[i] =ceil(df['day'].iloc[i] - day1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464343.html
標籤:Python python-3.x 熊猫 数据框 约会时间
上一篇:計算作業時間(平日和周六不同)
下一篇:Python日期時間錯誤?
