我有一个日期时间索引,我想将(上限)舍入到一天中的特定时间。我已经知道熊猫的偏移量aliases及其工作原理,但是我特别想告诉它将日期时间四舍五入到一天中的特定小时(或月份中的特定日期)。例如,我想进行这种转换:
print(results.index)
DatetimeIndex(['2018-12-14 05:00:00+01:00', '2018-12-14 06:00:00+01:00',
'2018-12-14 07:00:00+01:00', '2018-12-14 08:00:00+01:00',
'2018-12-14 09:00:00+01:00', '2018-12-14 10:00:00+01:00',
'2018-12-14 11:00:00+01:00', '2018-12-14 12:00:00+01:00',
'2018-12-14 13:00:00+01:00', '2018-12-14 14:00:00+01:00',
变成
DatetimeIndex(['2018-12-14 08:00:00+01:00', '2018-12-14 08:00:00+01:00',
'2018-12-14 08:00:00+01:00', '2018-12-14 08:00:00+01:00',
'2018-12-15 08:00:00+01:00', '2018-12-15 08:00:00+01:00',
'2018-12-15 08:00:00+01:00', '2018-12-15 08:00:00+01:00',
'2018-12-15 08:00:00+01:00', '2018-12-15 08:00:00+01:00',
据我所知,不存在可以传递给ceil()的参数,因为我们只能舍入到最接近的小时,天,月(freq ='H', 'D','M')... 是否有一个优雅的解决方案,还是我必须编写自己的for循环?
答案 0 :(得分:2)
一个想法是使用numpy.where
和offsets.DateOffset
-这里的hour
不带s
的意思是将值设置为8
,day
和{{1 }}意味着将原始日期增加一天:
s
另一个想法是使用d = pd.DatetimeIndex(['2018-12-14 05:00:00+01:00', '2018-12-14 06:00:00+01:00',
'2018-12-14 07:00:00+01:00', '2018-12-14 08:00:00+01:00',
'2018-12-14 09:00:00+01:00', '2018-12-14 10:00:00+01:00',
'2018-12-14 11:00:00+01:00', '2018-12-14 12:00:00+01:00',
'2018-12-14 13:00:00+01:00', '2018-12-14 14:00:00+01:00'])
results = pd.DataFrame(index=d)
out = np.where(results.index.hour <= 8,
results.index + pd.offsets.DateOffset(hour=8),
results.index + pd.offsets.DateOffset(days=1, hour=8))
print (pd.DatetimeIndex(out))
DatetimeIndex(['2018-12-14 08:00:00+01:00', '2018-12-14 08:00:00+01:00',
'2018-12-14 08:00:00+01:00', '2018-12-14 08:00:00+01:00',
'2018-12-15 08:00:00+01:00', '2018-12-15 08:00:00+01:00',
'2018-12-15 08:00:00+01:00', '2018-12-15 08:00:00+01:00',
'2018-12-15 08:00:00+01:00', '2018-12-15 08:00:00+01:00'],
dtype='datetime64[ns, pytz.FixedOffset(60)]', freq=None)
并仅在条件为Timedelta
时添加日期:
True
m = results.index.hour > 8
out = results.index + pd.offsets.DateOffset(hour=8) + pd.Timedelta(days=1) * m
print (out)
DatetimeIndex(['2018-12-14 08:00:00+01:00', '2018-12-14 08:00:00+01:00',
'2018-12-14 08:00:00+01:00', '2018-12-14 08:00:00+01:00',
'2018-12-15 08:00:00+01:00', '2018-12-15 08:00:00+01:00',
'2018-12-15 08:00:00+01:00', '2018-12-15 08:00:00+01:00',
'2018-12-15 08:00:00+01:00', '2018-12-15 08:00:00+01:00'],
dtype='datetime64[ns, pytz.FixedOffset(60)]', freq=None)