如何在日期时间增加小时数时自然地翻转到第二天

时间:2014-09-01 16:35:43

标签: python datetime

我有一些代码需要量化从文件中读取的日期。例如,将11:50设置为12:00以清除数字。我目前使用以下内容执行此操作:

end = end.replace(hour = end.hour + 1, minute = 0)

如果end.hour是晚上11点,则会遇到问题,因为这将转到第二天。您可以使用像......这样的代码来防止这种情况。

if end.hour == 23:
    end = end.replace(day = end.day + 1, hour = 0, minute = 0)
else:
    end = end.replace(hour= end.hour + 1, minute=0)

但是如果那一天是这个月的最后一天呢?然后你需要翻到下个月,依此类推。

必须有一种更清洁的方法来做到这一点。如何处理量化日期,同时考虑滚动到下一天/月/年?

2 个答案:

答案 0 :(得分:2)

使用timedelta() object,而不是使用datetime.replace(),添加到datetime对象:

end += timedelta(hours=1)

这将照顾您的日期:

>>> from datetime import datetime, timedelta
>>> end = datetime(2014, 9, 1, 22, 45)
>>> end += timedelta(hours=1)
>>> end
datetime.datetime(2014, 9, 1, 23, 45)
>>> end += timedelta(hours=1)
>>> end
datetime.datetime(2014, 9, 2, 0, 45)

这也适用于递增月份和年份,当然:

>>> last_day = datetime(2014, 12, 31, 23, 45)
>>> last_day + timedelta(hours=1)
datetime.datetime(2015, 1, 1, 0, 45)

答案 1 :(得分:1)

要舍入到下一个小时(所以分钟= 0),您可以像这样使用dateutil

import datetime as DT
import dateutil.rrule as rrule

def next_hour(date):
    rr = rrule.rrule(rrule.HOURLY, byminute=[0], dtstart=date, count=1)
    return rr.after(date, inc=True)

print(next_hour(DT.datetime(2000,1,31,11,50)))    
# 2000-01-31 12:00:00

print(next_hour(DT.datetime(2000,1,31,12,0)))    
# 2000-01-31 12:00:00

print(next_hour(DT.datetime(2000,1,31,23,50)))    
# 2000-02-01 00:00:00