cs_*_*bie 41 python datetime numpy date
我无法将python datetime64对象转换为字符串.例如:
t = numpy.datetime64('2012-06-30T20:00:00.000000000-0400')
Run Code Online (Sandbox Code Playgroud)
成:
'2012.07.01' as a string. (note time difference)
Run Code Online (Sandbox Code Playgroud)
我已经尝试将datetime64对象转换为datetimelong然后转换为字符串,但我似乎得到了这个错误:
dt = t.astype(datetime.datetime) #1341100800000000000L
time.ctime(dt)
ValueError: unconvertible time
Run Code Online (Sandbox Code Playgroud)
cs_*_*bie 57
解决方案是:
import pandas as pd
ts = pd.to_datetime(str(date))
d = ts.strftime('%Y.%m.%d')
Run Code Online (Sandbox Code Playgroud)
cit*_*man 32
如果您不想进行转换gobbledygook并且只使用一种日期格式,这对我来说是最好的解决方案
str(t)[:10]
Out[11]: '2012-07-01'
Run Code Online (Sandbox Code Playgroud)
Jul*_*lie 23
您可以使用 Numpy 的datetime_as_string功能。该unit='D'参数指定的精度,在这种情况下天。
>>> t = numpy.datetime64('2012-06-30T20:00:00.000000000-0400')
>>> numpy.datetime_as_string(t, unit='D')
'2012-07-01'
Run Code Online (Sandbox Code Playgroud)
bru*_*off 10
t.item().strftime('%Y.%m.%d')
.item()将投射numpy.datetime64到datetime.datetime,无需导入任何内容。
有一条路线不使用pandas;但请参阅下面的警告。
好吧,该t变量的分辨率为纳秒,可以通过在 python 中检查来显示:
>>> numpy.dtype(t)
dtype('<M8[ns]')
Run Code Online (Sandbox Code Playgroud)
这意味着该值的整数值为UNIX时间戳的10^9倍。您的问题中打印的值给出了这一提示。您最好的选择是将 的积分值除以t10 亿,然后您可以使用time.strftime:
>>> import time
>>> time.strftime("%Y.%m.%d", time.gmtime(t.astype(int)/1000000000))
2012.07.01
Run Code Online (Sandbox Code Playgroud)
在使用它时,请注意两个假设:
1)datetime64分辨率为纳秒
2)datetime64中存储的时间是UTC
旁注 1:有趣的是,numpy 开发人员决定 [1]datetime64分辨率大于微秒的对象将被转换为类型long,这解释了为什么t.astype(datetime.datetime)会产生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。