熊猫日期时间索引到一天中的特定小时

时间:2020-10-07 12:02:55

标签: python pandas datetime

我有一个日期时间索引,我想将(上限)舍入到一天中的特定时间。我已经知道熊猫的偏移量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循环?

1 个答案:

答案 0 :(得分:2)

一个想法是使用numpy.whereoffsets.DateOffset-这里的hour不带s的意思是将值设置为8day和{{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)