簡體   English   中英

將隨機時間間隔轉換為 30 分鍾結構化間隔

[英]Transform the Random time intervals to 30 mins Structured interval

我有這個數據框,其中一些任務發生的時間段

                    Date       Start Time              End Time
0     2016-01-01 0:00:00   2016-01-01 0:10:00   2016-01-01 0:25:00
1     2016-01-01 0:00:00   2016-01-01 1:17:00   2016-01-01 1:31:00
2     2016-01-02 0:00:00   2016-01-02 0:30:00   2016-01-02 0:32:00
...                  ...                  ...                  ...

將此 df 轉換為 30 分鍾間隔 預期結果

                    Date       Hours              
1     2016-01-01 0:30:00        0:15
2     2016-01-01 1:00:00        0:00
3     2016-01-01 1:30:00        0:13
4     2016-01-01 2:00:00        0:01
5     2016-01-01 2:30:00        0:00
6     2016-01-01 3:00:00        0:00
...                  ...            
47     2016-01-01 23:30:00        0:00
48     2016-01-02 23:59:59        0:00
49     2016-01-02 00:30:00        0:00
50     2016-01-02 01:00:00        0:02
...                  ...               

我正在嘗試使用 for 循環,這變得很乏味。 在熊貓中做任何簡單的方法。

IIUC 您可以丟棄Date列,獲取開始和結束之間的時間差, groupby 30 分鍾,然后agg first (假設您總是每 30 分鍾時段只有一個條目):

print (df.assign(Diff=df["End Time"]-df["Start Time"])
         .groupby(pd.Grouper(key="Start Time", freq="30T"))
         .agg({"Diff": "first"})
         .fillna(pd.Timedelta(seconds=0)))

                               Diff
Start Time                         
2016-01-01 00:00:00 0 days 00:15:00
2016-01-01 00:30:00 0 days 00:00:00
2016-01-01 01:00:00 0 days 00:14:00
2016-01-01 01:30:00 0 days 00:00:00
2016-01-01 02:00:00 0 days 00:00:00
2016-01-01 02:30:00 0 days 00:00:00
...
2016-01-02 00:30:00 0 days 00:02:00

這個想法是在min開始時間和max結束時間之間創建一個每分鍾 0 和DatetimeIndex的系列。 然后在開始時間處加 1,在結束時間處減 1。 然后,您可以使用cumsum來計算 Start 和 End、 resample.sum每 30 分鍾和reset_index之間的值。 最后一行代碼是在Hours 列中獲取正確的格式。

#create a series of 0 with a datetime index 
res = pd.Series(data=0, 
                index= pd.DatetimeIndex(pd.date_range(df['Start Time'].min(), 
                                                      df['End Time'].max(), 
                                                      freq='T'), 
                                        name='Dates'),
                name='Hours')

# add 1 o the start time and remove 1 to the end start
res[df['Start Time']] += 1
res[df['End Time']] -= 1

# cumsum to get the right value for each minute then resample per 30 minutes
res = (res.cumsum()
          .resample('30T', label='right').sum()
          .reset_index('Dates')
      )

# change the format of the Hours column, honestly not necessary
res['Hours'] =  pd.to_datetime(res['Hours'], format='%M').dt.strftime('%H:%M') # or .dt.time

print(res)
                 Dates  Hours
0  2016-01-01 00:30:00  00:15
1  2016-01-01 01:00:00  00:00
2  2016-01-01 01:30:00  00:13
3  2016-01-01 02:00:00  00:01
4  2016-01-01 02:30:00  00:00
5  2016-01-01 03:00:00  00:00
...
48 2016-01-02 00:30:00  00:00
49 2016-01-02 01:00:00  00:02

暫無
暫無

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

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