【问题标题】:Split time ranges on each hour of the day在一天中的每个小时拆分时间范围
【发布时间】:2021-08-17 03:01:33
【问题描述】:

我试图将一天中多个小时重叠的时间范围分成两行,每行代表每小时的时间(并留下开始和结束时间都在一天中的同一小时内的时间范围)。

示例数据框:

df1 = pd.DataFrame({'id':['A','B','C'],
                   'start_time':['2021-03-01 11:52:11+00:00','2021-03-01 11:53:10+00:00','2021-03-01 12:01:54+00:00'],
                   'end_time':['2021-03-01 12:14:45+00:00','2021-03-01 12:09:40+00:00','2021-03-01 12:57:03+00:00']})
df1['start_time'] = pd.to_datetime(df1['start_time']) 
df1['end_time'] = pd.to_datetime(df1['end_time']) 

看起来像:

--------------------------------------------------------------------------
index    id   start_time                     end_time
0        A    2021-03-01 11:52:11+00:00      2021-03-01 12:14:45+00:00
1        B    2021-03-01 11:53:10+00:00      2021-03-01 12:09:40+00:00
2        C    2021-03-01 12:01:54+00:00      2021-03-01 12:57:03+00:00
--------------------------------------------------------------------------

我希望得到如下结果:

--------------------------------------------------------------------------
index    id   start_time                     end_time
0        A    2021-03-01 11:52:11+00:00      2021-03-01 12:00:00+00:00
1        A    2021-03-01 12:00:00+00:00      2021-03-01 12:14:45+00:00
2        B    2021-03-01 11:53:10+00:00      2021-03-01 12:00:00+00:00
3        B    2021-03-01 12:00:00+00:00      2021-03-01 12:09:40+00:00
4        C    2021-03-01 12:01:54+00:00      2021-03-01 12:57:03+00:00
--------------------------------------------------------------------------

【问题讨论】:

    标签: python pandas datetime time


    【解决方案1】:
    def myfunc(sr):
        """Return all pairwise hours between start_time and end_time."""
        dtl = pd.date_range(sr["start_time"].floor("H"),
                            sr["end_time"].ceil("H"),
                            freq="H").tolist()
        dtl[0] = sr["start_time"]
        dtl[-1] = sr["end_time"]
        return list(zip(dtl[0:-1], dtl[1:]))
    
    # One row -> (start, next_hour) or (curr_hour, next_hour) or (curr_hour, end)
    pairs = df1.apply(myfunc, axis="columns").explode()
    
    # Build output dataframe from list 'pairs'
    out = pd.DataFrame(pairs.tolist(), 
                       columns=["start_time", "end_time"],
                       index=pairs.index)
    
    # Merge with 'df1'
    out = df1[["id"]].join(out).reset_index(drop=True)
    
    >>> out
      id                start_time                  end_time
    0  A 2021-03-01 11:52:11+00:00 2021-03-01 12:00:00+00:00
    1  A 2021-03-01 12:00:00+00:00 2021-03-01 12:14:45+00:00
    2  B 2021-03-01 11:53:10+00:00 2021-03-01 12:00:00+00:00
    3  B 2021-03-01 12:00:00+00:00 2021-03-01 12:09:40+00:00
    4  C 2021-03-01 12:01:54+00:00 2021-03-01 12:57:03+00:00
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多