有一条不用pandas的路线;但请参阅下面的警告。
嗯,这个t
变量有纳秒的分辨率,这可以通过python中的检查来显示:
>>> numpy.dtype(t)
dtype('<M8[ns]')
这意味着这个值的整数值是 UNIX 时间戳的 10^9 倍。您的问题中打印的值给出了该提示。您最好的选择是将积分值t
除以 10 亿,然后您可以使用time.strftime
:
>>> import time
>>> time.strftime("%Y.%m.%d", time.gmtime(t.astype(int)/1000000000))
2012.07.01
在使用它时,请注意两个假设:
1) datetime64 分辨率为纳秒
2) datetime64 中存储的时间为 UTC
旁注 1:有趣的是,numpy 开发人员决定 [1] 将datetime64
分辨率大于微秒的对象转换为long
类型,这解释了为什么t.astype(datetime.datetime)
yield 1341100800000000000L
。原因是datetime.datetime
对象不能准确地表示纳秒或更精细的时间尺度,因为它支持的分辨率datetime.datetime
只有微秒。
旁注 2:注意 numpy 1.10 及更早版本与 1.11 及更高版本之间的不同约定:
在 numpy <= 1.10 中,datetime64 在内部存储为 UTC,并打印为本地时间。如果未指定 TZ,则解析假定为本地时间,否则考虑时区偏移量。
在 numpy >= 1.11 中,datetime64 在内部存储为与时区无关的值(自 1970-01-01 00:00 在未指定的时区中的秒数),并按原样打印。时间解析不假定时区,尽管+NNNN
仍然允许样式时区转换并且该值被转换为 UTC。
[1]:https ://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/datetime.c见例程convert_datetime_to_pyobject
。