簡體   English   中英

計算給定 start_time 和 end_time 的每 30 分鍾塊中的分鍾數

[英]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_timeend_time ,我想將其轉換為以下數據集,以便我可以獲得每個 30 分鍾塊中的總分鍾數,其中每個塊以一小時的第 0 分鍾或第 30 分鍾為界(例如, 8:30-9:00 而不是 8:40-9:10)。

在此處輸入圖像描述


我嘗試了什么:

我能想到的創建數據框的唯一方法是通過 for 循環使用以下變量,其中is_start_timeis_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_timeis_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM