【问题标题】:How do you create numpy.datetime64 object from a unix timestamp and set the timezone to UTC?如何从 unix 时间戳创建 numpy.datetime64 对象并将时区设置为 UTC?
【发布时间】:2012-06-23 03:05:06
【问题描述】:

我有一个过程,我在 Zulu 或 UTC 时间读入一堆 ISO 8601 格式的字符串。例如,

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

我将字符串转换为可识别时区的 Python 日期时间对象,然后通过将它们转换为 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')...我想。

问候

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    根据the documentation 判断,唯一的方法是从直接指定时区的字符串创建它。因此,您需要先创建一个datetime.datetime 对象并将其格式化为附加'Z' 的字符串,然后从中构造numpy.datetime64

    【讨论】:

    • 感谢您的回复。我必须确定将时间戳存储为整数所获得的收益与将其转换回字符串附加“Z”然后实例化 datetime64 对象的成本。
    【解决方案2】:

    如何为您的代码设置时区。

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

    【讨论】:

    • 看起来这需要 numpy >= 1.7.0。创建 datetime64 似乎不允许在 1.6.2 中指定秒数: import pkg_resources pkg_resources.get_distribution('numpy').version '1.6.2' np.datetime64(1338624706, 's') TypeError: function takes at most 1论据(给定 2 个)
    • 代码对我来说似乎是错误的:utc 和 gmt 是否相同? (关于夏令时,UTC 不遵循夏令时:stackoverflow.com/questions/5495803/…
    • UTC 比 GMT 更近、更精确。最好使用UTC。他们都没有遵循夏令时。 geography.about.com/od/timeandtimezones/a/gmtutc.htm
    【解决方案3】:

    您可以使用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附加本地时区时,它至少会反映正确的时间?我想知道夏令时转换效果如何。
    • 是的,完全正确。无论当地时区如何,它都应该可以正常工作
    • 感谢您的回复。似乎我最好将时间戳保留为字符串。我将不得不在 datetime64 上做更多的阅读,但理想情况下我总是喜欢使用 UTC 时间。
    • 我认为 datetim64 没有任何方法可以显示为 UTC。以上时间与您的 UTC 时间相同,但在当地时区。
    • 啊,是的,明白了。似乎最好的方法可能是将时间戳保留为字符串。
    猜你喜欢
    • 2012-08-05
    • 2017-03-26
    • 2016-06-11
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多