【问题标题】:Aggregate a time interval on individual dates汇总各个日期的时间间隔
【发布时间】:2019-03-08 10:37:43
【问题描述】:

我有带有两个时间戳列 startend

的 pandas 数据框
    start                      end
2014-08-28 17:00:00 | 2014-08-29 22:00:00
2014-08-29 10:45:00 | 2014-09-01 17:00:00
2014-09-01 15:00:00 | 2014-09-01 19:00:00

目的是汇总在给定日期记录的小时数。所以在我的例子中。

我将创建日期范围并汇总多个条目的小时数。

2014-08-28 -> 7 hrs
2014-08-29 -> 10 hrs + 1 hr 15 min => 11 hrs 15 mins
2014-08-30 -> 24 hrs
2014-08-31 -> 24 hrs
2014-09-01 -> 17 hrs + 4 hrs => 21 hrs

我尝试过使用 timedelta,但它只以绝对小时为单位,而不是每天。

我也尝试过分解行(即按天拆分行,但我只能让它在日期级别工作,而不是在时间戳级别)

非常感谢任何建议。

【问题讨论】:

    标签: python pandas timestamp time-series aggregation


    【解决方案1】:

    您可以使用pd.date_range 来创建每天花费的minute to minute interval,之后您可以计算花费的分钟数并将其转换为时间增量

    start   end
    0   2014-08-28 17:00:00 2014-08-29 22:00:00
    1   2014-08-29 10:45:00 2014-09-01 17:00:00
    2   2014-09-01 15:00:00 2014-09-01 19:00:00
    
    
    #Creating the minute to minute time intervals from start to end date of each line and creating as one series of dates 
    a = pd.Series(sum(df.apply(lambda x: pd.date_range(x['start'],x['end'],freq='min').tolist(),1).tolist(),[])).dt.date
    # Counting the each mintue intervals and converting to time stamps
    a.value_counts().apply(lambda x: pd.to_timedelta(x,'m'))
    

    输出:

    2014-08-29   1 days 11:16:00
    2014-08-30   1 days 00:00:00
    2014-08-31   1 days 00:00:00
    2014-09-01   0 days 21:02:00
    2014-08-28   0 days 07:00:00
    dtype: timedelta64[ns]
    

    【讨论】:

      【解决方案2】:

      希望这会很有用。我想您将能够进行调整以达到您的目的。思考方式如下 - 存储日期和dict中的相应时间。如果是同一天 - 只写差异。否则,将时间写入到第一个午夜,在需要的天数时进行迭代,并从最后一个午夜写入时间到结束。仅供参考...我猜 2014-09-01 的结果可能是 21 小时。

      from datetime import datetime, timedelta
      from collections import defaultdict
      
      
      s = [('2014-08-28 17:00:00', '2014-08-29 22:00:00'),
           ('2014-08-29 10:45:00', '2014-09-01 17:00:00'),
           ('2014-09-01 15:00:00', '2014-09-01 19:00:00') ]
      
      
      def aggreate(time):
          store = defaultdict(timedelta)
      
          for slice in time:
              start = datetime.strptime(slice[0], "%Y-%m-%d %H:%M:%S")
              end = datetime.strptime(slice[1], "%Y-%m-%d %H:%M:%S")
      
              start_date = start.date()
              end_date = end.date()
      
              if start_date == end_date:
                  store[start_date] += end - start
      
              else:
                  midnight = datetime(start.year, start.month, start.day + 1, 0, 0, 0)
                  part1 = midnight - start
                  store[start_date] += part1
      
                  for i in range(1, (end_date - start_date).days):
                      next_date = start_date + timedelta(days=i)
                      store[next_date] += timedelta(hours=24)
      
                  last_midnight = datetime(end_date.year, end_date.month, end_date.day, 0, 0, 0)
                  store[end_date] += end - last_midnight
      
          return store
      
      
      r = aggreate(s)
      
      for i in r:
          print(i, r[i])
      
      2014-08-28 7:00:00
      2014-08-29 1 day, 11:15:00
      2014-08-30 1 day, 0:00:00
      2014-08-31 1 day, 0:00:00
      2014-09-01 21:00:00
      

      【讨论】:

        猜你喜欢
        • 2019-12-13
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        相关资源
        最近更新 更多