使用时间,日期,timedelta

时间:2012-05-15 20:33:50

标签: python datetime numpy scipy

我有一个问题,我的工作时间和时间差异很大。到目前为止,我已经使用许多if语句解决了这个问题,但这些都容易出错。在寻找更好的解决方案而不重新发明轮子时,我遇到了时间,日期和时间。但这些对我来说似乎太不灵活,所以我正在寻找有关如何使用python的内置函数解决这个问题的想法和技巧 - 如果可能的话。这就是问题:将从条带到规则网格的卫星数据分箱涉及大量简单的时间计算。如果我有日期整数:200702100700我想从这样的时间格式中添加和减去小时和分钟,这样日期 - 18会给我一个考虑闰年的新日期,可以跨越,年,月,日向后和转发。以下是我对python的datetime包的理解:

from datetime import timedelta, date, time
t1 = date(2007,01,01); t = time(12,0); t2 = datetime.combine(t1,t)
t3 = timedelta(hours=18); t4 = t2 - t3; t5 = t2 + t3
print t4
>>>datetime.timedelta(2006, 23401, 3001)

这个时间在一个可以进行数千次计算的脚本中不是很有用。我的问题是t4没有年,月或日对象,而2006似乎被视为小时。这一切都非常令人困惑。这可能在python / numpy / scipy中吗?如果是这样,有人可以给我一个提示吗?

3 个答案:

答案 0 :(得分:6)

Gerrat做对了,使用了datetime对象。

您可以完全创建日期时间对象,而无需单独创建日期和时间(或使用datetime.strptime())。

BUG ALERT 您的代码和一些已发布的响应会引发一个很难看到的错误。

// this works
datetime(2007,01,01,12)
// this breaks
datetime(2007,01,09,12)

在python中,在“09”中键入“0”使其在代码中使用日期时为八进制数(“09”无效),避免前导零。

答案 1 :(得分:3)

from datetime import datetime, timedelta, date, time
t2 = datetime(2007, 1, 1, 12, 0, 0); 
t3 = timedelta(hours=18); t4 = t2 - t3; t5 = t2 + t3
print "YEAR", t4.year
print "MONTH", t4.month
print "DAY", t4.day
print "HOUR", t4.hour
print "MINUTE", t4.minute

运行那个......

[Mike_Pennington ~]$ python foo.py 
YEAR 2006
MONTH 12
DAY 31
HOUR 18
MINUTE 0
[Mike_Pennington ~]$

答案 2 :(得分:2)

您要使用的是日期时间对象,而不是日期对象:

from datetime import datetime, timedelta
t1 = datetime(2007, 01, 01)
print t1 - timedelta(days=18)
>>>datetime.datetime(2006, 12, 14, 0, 0)
print t1 - timedelta(hours=18)
>>>datetime.datetime(2006, 12, 31, 6, 0)

这也适用于小时,分钟和秒!