如何从Unix时间戳创建numpy.datetime64对象并将时区设置为UTC?

4

我有一个流程,需要读取一堆ISO 8601格式的字符串,这些字符串代表Zulu或UTC时间。例如:

2012-06-20T21:15:00Z
2012-06-20T21:16:00Z
2012-06-20T21:17:00Z
2012-06-20T21:18:00Z

我将字符串转换为时区感知的Python datetime对象,然后将它们转换为Unix时间戳的整数,并以二进制格式保存。例如:

dt_str = '2012-06-20T21:15:00Z'
ts = int(mktime(datetime.strptime(dt_str, '%Y-%m-%dT%H:%M:%SZ').timetuple()))
# ts = 1340241300

当我将这些时间戳读回到另一个进程中时,我希望能够直接从时间戳实例化一个numpy.datetime64对象。问题在于datetime64会将时区设置为本地时区。

np_dt = np.datetime64(ts,'s')
# np_dt = numpy.datetime64('2012-06-20T21:15:00-0400')

有没有方法可以将我的时间戳转换为UTC时间并读取?我想让np_dt等于numpy.datetime64('2012-06-20T21:15:00-0000')...好像是这样。

谢谢!

3个回答

4

那么如何为您的代码设置时区呢?

import os, time
os.environ['TZ'] = 'GMT'
time.tzset()
# then your code 
np_dt = np.datetime64(ts,'s')

看起来需要numpy >= 1.7.0。在1.6.2中创建datetime64似乎不允许指定秒:import pkg_resources pkg_resources.get_distribution('numpy').version '1.6.2' np.datetime64(1338624706, 's') TypeError: function takes at most 1 argument (2 given) - Kurt Schwehr
代码对我来说似乎有问题:UTC和GMT是一样的吗?(夏令时怎么办,UTC不遵循夏令时:https://dev59.com/MW035IYBdhLWcg3wT-RC....) - ntg
UTC比GMT更近,更精确。最好使用UTC。它们都不遵循夏令时。http://geography.about.com/od/timeandtimezones/a/gmtutc.htm - karlcow

1

您可以使用dateutil模块来帮助您。首先,从您保存的时间戳整数创建一个日期时间对象:

>>> ts = 1340241300
>>> import datetime
>>> from dateutil import tz
>>> dt = datetime.datetime.fromtimestamp(ts).replace(tzinfo=tz.tzutc())
>>> dt
datetime.datetime(2012, 6, 20, 21, 15, tzinfo=tzutc())

然后将其传递给numpy,它将把它转换为本地时区(我在-4):

>>> import numpy as np
>>> np.datetime64(dt.isoformat())
numpy.datetime64('2012-06-20T17:15:00-0400')

那么,想法是将UTC转换为本地时区,这样当numpy附加本地时区时,它至少会反映出正确的时间?我想知道在夏令时转换方面它的工作效果如何。 - Mark Ransom
是的,没错。无论本地时区如何,它都应该正常工作。 - jterrace
谢谢您的回复。看起来我最好把时间戳保留为字符串。我需要进一步阅读datetime64,但理想情况下,我希望始终使用协调世界时(UTC)时间。 - aquil.abdullah
我认为没有办法使datetime64表现为UTC。上面的时间与您的UTC时间相同,但是以本地时区显示。 - jterrace
啊,好的,明白了。看起来最好的方法可能是将时间戳保留为字符串。 - aquil.abdullah

0
文档来看,唯一的方法是从指定时区的字符串创建它。因此,您需要首先创建一个datetime.datetime对象,并在其后附加'Z'格式化为字符串,然后使用该字符串构造numpy.datetime64

谢谢回复。我需要确定将时间戳存储为整数与将其转换回字符串、附加“Z”并实例化datetime64对象所需的成本之间的收益差异。 - aquil.abdullah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接