所以我有一個這樣的資料框
df1 = {'id':[123,347],
'shift_start':['2022-01-25 09:00:00', '2022-01-28 19:00:00'],
'shift_end':['2022-01-25 12:30:00', '2022-01-29 00:00:00']}
df1 = pd.DataFrame(df1,columns=['id','shift_start', 'shift_end'])
id shift_start shift_end
123 2022-01-25 09:00:00 2022-01-28 12:30:00
347 2022-01-25 23:00:00 2022-01-29 00:00:00
而且我想為每個 id 獲得每個班次中有多少個 30 分鐘的時段,所以像這樣
id shift_start shift_end slot_start slot_end
123 2022-01-25 09:00:00 2022-01-28 12:30:00 2022-01-25 09:00:00 2022-01-25 09:30:00
123 2022-01-25 09:00:00 2022-01-28 12:30:00 2022-01-25 09:30:00 2022-01-25 10:00:00
123 2022-01-25 09:00:00 2022-01-28 12:30:00 2022-01-25 10:00:00 2022-01-25 10:30:00
123 2022-01-25 09:00:00 2022-01-28 12:30:00 2022-01-25 10:30:00 2022-01-25 11:00:00
123 2022-01-25 09:00:00 2022-01-28 12:30:00 2022-01-25 11:00:00 2022-01-25 11:30:00
123 2022-01-25 09:00:00 2022-01-28 12:30:00 2022-01-25 11:30:00 2022-01-25 12:00:00
123 2022-01-25 09:00:00 2022-01-28 12:30:00 2022-01-25 12:00:00 2022-01-25 12:30:00
347 2022-01-25 23:00:00 2022-01-29 00:00:00 2022-01-25 23:00:00 2022-01-29 23:30:00
347 2022-01-25 23:00:00 2022-01-29 00:00:00 2022-01-25 23:30:00 2022-01-29 00:00:00
我找到了找到 30 分鐘插槽的方法,但我仍然找不到將它們添加到資料框中的方法
def datetime_range(start, end, delta):
current = start
while current < end:
yield current
current = delta
for index, row in df1.iterrows():
dts = [dt.strftime('%Y-%m-%d %H:%M:%S') for dt in
datetime_range(datetime(row['shift_start'].year, row['shift_start'].month, row['shift_start'].day, row['shift_start'].hour, row['shift_start'].minute),
datetime(row['shift_end'].year, row['shift_end'].month, row['shift_end'].day, row['shift_end'].hour, row['shift_end'].minute),
timedelta(minutes=30))]
print(dts)
任何幫助都將受到歡迎。謝謝!
uj5u.com熱心網友回復:
這是一種方法:
slots = df1[['shift_start', 'shift_end']]
.apply(lambda x: pd.date_range(*x, freq='30min'), axis=1)
.explode()
.rename('slot_start')
.to_frame()
slots['slot_end'] = slots['slot_start'].shift(-1)
df1 = pd.concat([df1, slots], axis=1).dropna()
df1 = df1[(df1.shift_end >= df1.slot_end)]
輸出:
id shift_start shift_end slot_start slot_end
0 123 2022-01-25 09:00:00 2022-01-25 12:30:00 2022-01-25 09:00:00 2022-01-25 09:30:00
0 123 2022-01-25 09:00:00 2022-01-25 12:30:00 2022-01-25 09:30:00 2022-01-25 10:00:00
0 123 2022-01-25 09:00:00 2022-01-25 12:30:00 2022-01-25 10:00:00 2022-01-25 10:30:00
0 123 2022-01-25 09:00:00 2022-01-25 12:30:00 2022-01-25 10:30:00 2022-01-25 11:00:00
0 123 2022-01-25 09:00:00 2022-01-25 12:30:00 2022-01-25 11:00:00 2022-01-25 11:30:00
0 123 2022-01-25 09:00:00 2022-01-25 12:30:00 2022-01-25 11:30:00 2022-01-25 12:00:00
0 123 2022-01-25 09:00:00 2022-01-25 12:30:00 2022-01-25 12:00:00 2022-01-25 12:30:00
1 347 2022-01-28 19:00:00 2022-01-29 00:00:00 2022-01-28 19:00:00 2022-01-28 19:30:00
1 347 2022-01-28 19:00:00 2022-01-29 00:00:00 2022-01-28 19:30:00 2022-01-28 20:00:00
1 347 2022-01-28 19:00:00 2022-01-29 00:00:00 2022-01-28 20:00:00 2022-01-28 20:30:00
1 347 2022-01-28 19:00:00 2022-01-29 00:00:00 2022-01-28 20:30:00 2022-01-28 21:00:00
1 347 2022-01-28 19:00:00 2022-01-29 00:00:00 2022-01-28 21:00:00 2022-01-28 21:30:00
1 347 2022-01-28 19:00:00 2022-01-29 00:00:00 2022-01-28 21:30:00 2022-01-28 22:00:00
1 347 2022-01-28 19:00:00 2022-01-29 00:00:00 2022-01-28 22:00:00 2022-01-28 22:30:00
1 347 2022-01-28 19:00:00 2022-01-29 00:00:00 2022-01-28 22:30:00 2022-01-28 23:00:00
1 347 2022-01-28 19:00:00 2022-01-29 00:00:00 2022-01-28 23:00:00 2022-01-28 23:30:00
1 347 2022-01-28 19:00:00 2022-01-29 00:00:00 2022-01-28 23:30:00 2022-01-29 00:00:00
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/421248.html
標籤:
上一篇:在熊貓中使用函式時按位置選擇列
下一篇:生成100個隨機股價
