【问题标题】:Sampling DataFrame based on Start and End time for each process per Group - Pandas [duplicate]根据每个组的每个进程的开始和结束时间对 DataFrame 进行采样 - Pandas [重复]
【发布时间】:2023-02-24 20:43:53
【问题描述】:

我有一个数据框,其中有以下列:

Group   |  Process  |  StartTime          |  EndTime            |
-----------------------------------------------------------------
  1     |     A     | 2023-01-01 10:09:18 | 2023-01-01 11:19:28 |
  1     |     B     | 2023-01-01 11:29:01 | 2023-01-01 19:29:00 |
  1     |     C     | 2023-01-01 19:56:11 | 2023-01-02 01:09:10 |
  2     |     A     | 2023-02-14 23:54:11 | 2023-02-15 04:01:14 |
  2     |     B     | 2023-02-14 05:56:11 | 2023-02-14 09:00:20 |
  2     |     D     | 2023-02-14 10:16:01 | 2023-02-14 21:06:30 |

我想要做的就是对于每个组,我想以 1 分钟的频率重新采样数据帧,包括开始时间和结束时间。

对于前。对于流程 A 的第 1 组,我将有从 01-01-2023 10:09 到 11:20 开始的行,以 1 分钟的频率采样,即 df.resample('1T')

Group   |  Process      | Sample Timestamp    |  StartTime          |  EndTime           |
    --------------------------------------------------------------------------------------
      1     |     A     | 2023-01-01 10:09:00 | 2023-01-01 10:09:18 | 2023-01-01 11:19:28|
      1     |     A     | 2023-01-01 10:10:00 | 2023-01-01 10:09:18 | 2023-01-01 11:19:28| 
      1     |     A     | 2023-01-01 10:11:00 | 2023-01-01 10:09:18 | 2023-01-01 11:19:28| 
      ....  |    ...    |  ...                |    ...              |   ...              |
      1     |     A     | 2023-01-01 11:18:00 | 2023-01-01 10:09:18 | 2023-01-01 11:19:28|
      1     |     A     | 2023-01-01 11:19:00 | 2023-01-01 10:09:18 | 2023-01-01 11:19:28|
      1     |     B     | 2023-01-01 11:29:00 | 2023-01-01 11:29:01 | 2023-01-01 19:29:00|
      1     |     B     | 2023-01-01 11:30:00 | 2023-01-01 11:29:01 | 2023-01-01 19:29:00|
      ....  |     ...   |    ...              |     ...             |   ...              |
      1     |     B     | 2023-01-01 19:28:00 | 2023-01-01 11:29:01 | 2023-01-01 19:29:00|
      1     |     B     | 2023-01-01 19:29:00 | 2023-01-01 11:29:01 | 2023-01-01 19:29:00|
      < same for Process C and other Groups as well>

作为参考,我在这里尝试了这段代码:Reference Code

但不幸的是,我无法按每个小组实施。

任何帮助表示赞赏。

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:

    You can use solution without resample:

    #convert both columns to datetimes
    df['StartTime'] = pd.to_datetime(df['StartTime'])
    df['EndTime'] = pd.to_datetime(df['EndTime'])
    
    #repeat indices by difference of columns in minutes
    df1 = df.loc[df.index.repeat(df['EndTime'].sub(df['StartTime']).dt.total_seconds() / 60+1)]
    
    #create counter by duplicated indices and convert to minute timedeltas
    s = pd.to_timedelta(df1.groupby(level=0).cumcount(), unit='Min')
    
    #insert new column with remove seconds from datetimes
    df1.insert(2, 'Sample Timestamp', df['StartTime'].dt.floor('Min') + s)
    print (df1)
        Group Process    Sample Timestamp           StartTime             EndTime
    0       1       A 2023-01-01 10:09:00 2023-01-01 10:09:18 2023-01-01 11:19:28
    0       1       A 2023-01-01 10:10:00 2023-01-01 10:09:18 2023-01-01 11:19:28
    0       1       A 2023-01-01 10:11:00 2023-01-01 10:09:18 2023-01-01 11:19:28
    0       1       A 2023-01-01 10:12:00 2023-01-01 10:09:18 2023-01-01 11:19:28
    0       1       A 2023-01-01 10:13:00 2023-01-01 10:09:18 2023-01-01 11:19:28
    ..    ...     ...                 ...                 ...                 ...
    5       2       D 2023-02-14 21:02:00 2023-02-14 10:16:01 2023-02-14 21:06:30
    5       2       D 2023-02-14 21:03:00 2023-02-14 10:16:01 2023-02-14 21:06:30
    5       2       D 2023-02-14 21:04:00 2023-02-14 10:16:01 2023-02-14 21:06:30
    5       2       D 2023-02-14 21:05:00 2023-02-14 10:16:01 2023-02-14 21:06:30
    5       2       D 2023-02-14 21:06:00 2023-02-14 10:16:01 2023-02-14 21:06:30
    
    [1948 rows x 5 columns]
    
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 2012-10-02
      相关资源
      最近更新 更多