![](/img/trans.png)
[英]How can I efficiently convert (start_time,[time_deltas]) to (start_time, end_time)?
[英]Count the minutes in each 30 minute block for a given start_time and end_time
問題:
我有以下數據框:
data_1 = {
'ID':['123'],
"Start_time" :[pd.Timestamp('08:40')],
"End_time" :[pd.Timestamp('10:01')]}
df_1 = pd.DataFrame(data_1)
每行代表會議的start_time
和end_time
,我想將其轉換為以下數據集,以便我可以獲得每個 30 分鍾塊中的總分鍾數,其中每個塊以一小時的第 0 分鍾或第 30 分鍾為界(例如, 8:30-9:00 而不是 8:40-9:10)。
我嘗試了什么:
我能想到的創建數據框的唯一方法是通過 for 循環使用以下變量,其中is_start_time
和is_end_time
表示new_start
是否屬於會議的開始/結束(還應該有一些邏輯分配上述兩個變量)。
8.40 - {new_start :8.40, block_start :8.30, block_end :9.00, is_start_time :1, is_end_time :0}
9.10 - {new_start :9.10, block_start :9.00, block_end :9.30, is_start_time :0, is_end_time :0}
9.40 - {new_start :9.40, block_start :9.30, block_end :10.00, is_start_time :0, is_end_time :0}
10.10 - {new_start :10.10, block_start :10.00, block_end :10.30, is_start_time :0, is_end_time :1}
然后使用變量is_start_time
和is_end_time
num_minutes
if is_start_time = 1 and is_end_time = 0:
num_minutes = block_end -new_start
else if is_start_time = 0 and is_end_time = 1 :
num_minutes = end_time - block_start
else :
num_minutes =30
這似乎是一個漫長的過程,我將不得不遍歷每個會議記錄來得出這一點。 有人可以使用 pandas 提出更好的方法嗎? 謝謝!
定義要應用於每一行的以下 function:
def rowProc(row):
t1 = row.Start_time.floor('30T')
t2 = row.End_time.ceil('30T')
rng = pd.date_range(t1, t2, freq='30T')
df = pd.DataFrame({'ID': row.ID, 'Start_time': row.Start_time,
'End_time': row.End_time, 'From': rng[:-1].strftime('%H:%M'),
'To': rng[1:].strftime('%H:%M'), 'num_minutes': 30})
df.iloc[0, 5] = 30 - int((row.Start_time - t1).total_seconds() / 60)
df.iloc[-1, 5] = df.iloc[-1, 5] - int((t2 - row.End_time).total_seconds() / 60)
df.insert(3, 'Block', df.From + '-' + df.To)
df.drop(columns=['From', 'To'], inplace=True)
return df
然后應用它並連接部分結果:
result = pd.concat(df_1.apply(rowProc, axis=1).values, ignore_index=True)
對於包含以下內容的源 DataFrame:
ID Start_time End_time
0 123 2021-12-02 08:40:00 2021-12-02 10:01:00
1 234 2021-12-02 10:20:00 2021-12-02 11:00:00
2 345 2021-12-02 11:10:00 2021-12-02 11:24:00
我有:
ID Start_time End_time Block num_minutes
0 123 2021-12-02 08:40:00 2021-12-02 10:01:00 08:30-09:00 20
1 123 2021-12-02 08:40:00 2021-12-02 10:01:00 09:00-09:30 30
2 123 2021-12-02 08:40:00 2021-12-02 10:01:00 09:30-10:00 30
3 123 2021-12-02 08:40:00 2021-12-02 10:01:00 10:00-10:30 1
4 234 2021-12-02 10:20:00 2021-12-02 11:00:00 10:00-10:30 10
5 234 2021-12-02 10:20:00 2021-12-02 11:00:00 10:30-11:00 30
6 345 2021-12-02 11:10:00 2021-12-02 11:24:00 11:00-11:30 14
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.