如何将日期时间添加到第二天时自动翻转

问题描述:

我有一些代码需要量化从文件中读取的日期。例如,设置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) 

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

必须有一个更干净的方式来做到这一点。如何处理量化日期,同时考虑到第二天/每月/每年?

+0

退房'datetime':https://docs.python.org/2/library/datetime.html – fuesika 2014-09-01 16:39:20

+1

@pyStarter:通过使用'.replace()'方法来判断OP * already *正在使用'datetime'模块。 – 2014-09-01 16:42:19

而不是使用datetime.replace(),使用timedelta() object,添加到您的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) 

四舍五入到下一个小时(所以分钟= 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 
+0

@Martijn:OP询问如何在11:50到12:00之间轮转。给日期时间添加'timedelta(hours = 1)'是不够的。据推测,OP也希望12点保持12:00。所以我不认为dateutil是矫枉过正的。我们以不同的方式解释这个问题。 – unutbu 2014-09-01 17:13:44

+0

你完全正确;我的错。 – 2014-09-01 17:17:37