【问题标题】:Pandas timedeltas ignoring date熊猫时间增量忽略日期
【发布时间】:2017-06-10 05:13:53
【问题描述】:

我有 2 个熊猫系列,每个都包含一个字符串:

times = pd.DataFrame({'bedtime': ['23:00', '0:30', '1:00'], 'waketime': ['6:00', '6:00', '4:00']})
print(times)

  bedtime waketime
0   23:00     6:00
1    0:30     6:00
2    1:00     4:00

我想计算时间之间的差异(基本上是睡眠时间),但是我没有日期信息,所以有点问题

我首先将每个系列转换为日期时间:

FMT = "%H:%M"
bedtime = pd.to_datetime(times["bedtime"], format=FMT)
waketime = pd.to_datetime(times["waketime"], format=FMT)

这个过程在时间上添加了一个日期,我不想要:

print(bedtime)
1900-01-01 23:00:00
1900-01-01 00:30:00
1900-01-01 01:00:00

由于添加了日期,时间增量偶尔会偏移一天:

hours_in_bed = waketime - bedtime
print(hours_in_bed)

-1 days +07:00:00
         05:30:00
         03:00:00

当不需要实际日期时,计算时间增量的正确方法是什么?我基本上只是想计算从睡觉到起床的时间小时

我已经看到有关如何从 datetime 对象中删除日期的其他问题,但在这里我更关心的是更正/删除时间增量中的 1 天班次

【问题讨论】:

    标签: python datetime pandas timedelta


    【解决方案1】:

    您可以使用to_timedelta 转换times,但问题仍然相同:

    FMT = "%H:%M"
    bedtime = pd.to_timedelta(times["bedtime"] + ':00', 'h')
    waketime = pd.to_timedelta(times["waketime"] + ':00', 'h')
    print(bedtime)
    0   23:00:00
    1   00:30:00
    2   01:00:00
    Name: bedtime, dtype: timedelta64[ns]
    
    print(waketime)
    0   06:00:00
    1   06:00:00
    2   04:00:00
    Name: waketime, dtype: timedelta64[ns]
    
    hours_in_bed = waketime - bedtime
    print(hours_in_bed)
    0   -1 days +07:00:00
    1            05:30:00
    2            03:00:00
    dtype: timedelta64[ns]
    

    解决方案只解析seconds并使用to_timedelta和参数s

    hours_in_bed = pd.to_timedelta(hours_in_bed.dt.seconds, unit='s')
    print(hours_in_bed)
    0   07:00:00
    1   05:30:00
    2   03:00:00
    dtype: timedelta64[ns]
    

    如果需要在hours输出,除以3600.0

    hours_in_bed = hours_in_bed.dt.seconds / 3600.0
    print(hours_in_bed)
    0    7.0
    1    5.5
    2    3.0
    dtype: float64
    

    【讨论】:

      【解决方案2】:

      您的 delta 包含负面的一天这一事实仅反映了一个事实,即一个人睡得晚(23:00:00)比起床(6:00)晚。您要么需要将日期添加到原始数据框中,要么接受它。您可以轻松消除白天部分:

      hours_in_bed.apply(lambda x : (x.components.hours,x.components.minutes))
      #0     (7, 0)
      #1    (5, 30)
      #2     (3, 0)
      #dtype: object
      

      【讨论】:

        猜你喜欢
        • 2016-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-15
        • 2014-06-25
        • 2013-02-15
        • 2016-07-05
        相关资源
        最近更新 更多