3

我有一个问题,我经常处理时间和时间差异。到目前为止,我已经使用许多 if 语句解决了这个问题,但这些很容易出错。在寻找更好的解决方案并且没有重新发明轮子的情况下,我遇到了时间、日期和时间增量。但是这些对我来说似乎太不灵活了,所以我正在寻找关于如何使用 python 的内置函数解决这个问题的想法和技巧——如果可能的话。这就是问题所在:将卫星数据从大片分区到常规网格涉及大量简单的时间计算。如果我有日期整数:200702100700 我想从这样的时间格式中添加和减去小时和分钟,这样 date - 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 中可能吗?如果是这样,有人可以给我小费吗?

4

3 回答 3

6

Gerrat 做对了,使用 datetime 对象。

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

BUG ALERT您的代码和一些发布的响应将注入一个难以看到的错误。

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

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

于 2012-05-15T20:57:45.850 回答
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 ~]$
于 2012-05-15T20:44:02.690 回答
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)

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

于 2012-05-15T20:43:26.823 回答