繁体   English   中英

Pandas 日期时间索引上限到一天中的特定时间

[英]Pandas datetime index ceil to specific hour in day

我有一个日期时间索引,我想将其四舍五入(ceil)到一天中的特定时间。 我已经知道 pandas 的偏移别名及其工作方式,但具体来说,我想告诉它将日期时间四舍五入到一天中的特定时间(或一个月中的特定日期)。 例如,我想进行这种转换:

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 循环代码?

一个想法是使用numpy.whereoffsets.DateOffset - 这里没有s hour意味着将值设置为8 ,带s day意味着在原始日期基础上增加一天:

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 s 并仅在条件为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)

m = results.index.hour > 8
out = results.index.floor('d') + pd.Timedelta(hours=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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM