簡體   English   中英

根據另一個 pandas 中的開始日期和結束日期列的條件創建新的 pandas dataframe

[英]Create new pandas dataframe based on a condition on Start Date and End Date Column in another pandas

我在 pandas dataframe 中有開始日期時間和結束日期時間列,如下所示。

在此處輸入圖像描述

如果結束日期和時間更改為另一天或另一個小時,我需要創建一個新行,其中開始時間為下一小時的開始時間,結束時間為該小時的結束時間(如果原始結束時間>小時)或等於原始數據中的結束時間(如果原始結束時間 < 當前時間)並且很快。 生成的預期表如下所示。

在此處輸入圖像描述

這對 Pandas 是否可行,因為我的數據在 dataframe 中

計算Start_TimeEnd_Time之間的小時差(稱為length ),然后使用df.reindex(df.reindex.repeat(...))將每一行重復length次。 然后在開始日期創建的每個組中分別為行分配一個從0length-1的計數器。

然后對於Start_Time ,只要計數器不為零(即這不是該日期的起始行),將時間四舍五入到hh:00:00並按計數器遞增hour

對於End_Time ,只要 counter 不等於length-1 (即這不是該日期的最后一行),請將End_Time設置為Start_Time但分鍾和秒重置為 59 即格式: hh:59:59其中小時是從Start_Time

利用:

df = (pd.DataFrame({
        'Start_Time': ['2019-08-29 17:29:29', 
              '2019-09-04 17:29:25', '2019-09-25 10:16:32'], 
        'End_Time': ['2019-08-29 17:32:18', 
              '2019-09-04 18:14:41', '2019-09-26 13:01:26']}))
df.Start_Time = pd.to_datetime(df.Start_Time)
df.End_Time = pd.to_datetime(df.End_Time)
timeDiff = df.End_Time.dt.floor(freq = 'H') - df.Start_Time.dt.floor(freq = 'H')

df['length'] = (timeDiff.dt.days * 24 + timeDiff.dt.seconds//3600 + 1)

df = df.reindex(df.index.repeat(df['length'])).reset_index(drop = True)
df['counter'] = (df.groupby(df.Start_Time.dt.date)['length']
                        .transform(lambda x: np.arange(x.iloc[0])))

mask = df.counter.eq(0)
(df.Start_Time.where(mask, df.Start_Time.dt.round('H') + 
              pd.to_timedelta(df.counter, unit = 'h'), inplace = True))


mask = df.length.eq(df.counter + 1)
masked_val = ((pd.to_timedelta(1, unit = 'h') + 
                df.Start_Time.dt.floor(freq = 'H'))
              .dt.ceil(freq = 'H') + pd.to_timedelta(-1, unit = 'S'))    

df.End_Time.where(mask, masked_val, inplace = True)
df.drop(columns = df.columns[2:], axis = 1, inplace = True)

Output:

>>> df
              Start_Time            End_Time
0  2019-08-29 17:29:29 2019-08-29 17:32:18
1  2019-09-04 17:29:25 2019-09-04 17:59:59
2  2019-09-04 18:00:00 2019-09-04 18:14:41
3  2019-09-25 10:16:32 2019-09-25 10:59:59
4  2019-09-25 11:00:00 2019-09-25 11:59:59
5  2019-09-25 12:00:00 2019-09-25 12:59:59
...
28 2019-09-26 11:00:00 2019-09-26 11:59:59
29 2019-09-26 12:00:00 2019-09-26 12:59:59
30 2019-09-26 13:00:00 2019-09-26 13:01:26

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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