熊猫timedeltas忽略日期

时间:2017-01-25 06:06:01

标签: python datetime pandas timedelta

我有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天班次

2 个答案:

答案 0 :(得分:0)

您可以使用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

答案 1 :(得分:0)

你的delta包含负面日这一事实只是反映了一个人晚上(23:00:00)睡觉比醒来(6点)的事实。您需要在原始数据框中添加日期,或者使用此日期。您可以轻松消除当天的部分:

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