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