我无法将python datetime64
对象转换为字符串。例如:
t = numpy.datetime64('2012-06-30T20:00:00.000000000-0400')
分为:
'2012.07.01' as a string. (note time difference)
我已经尝试将datetime64
对象转换为datetime
长然后转换为字符串,但我似乎得到了这个错误:
dt = t.astype(datetime.datetime) #1341100800000000000L
time.ctime(dt)
ValueError: unconvertible time
答案 0 :(得分:51)
解决方案是:
import pandas as pd
ts = pd.to_datetime(str(date))
d = ts.strftime('%Y.%m.%d')
答案 1 :(得分:21)
如果您不想进行转换gobbledygook并且只使用一种日期格式,那么这对我来说是最好的解决方案
UICollectionView
答案 2 :(得分:5)
您可以使用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'
答案 3 :(得分:3)
我想要一个ISO 8601格式的字符串,而不需要任何额外的依赖项。我的numpy_array有一个元素作为datetime64。在@ Wirawan-Purwanto的帮助下,我补充了一点:
from datetime import datetime
ts = numpy_array.values.astype(datetime)/1000000000
return datetime.utcfromtimestamp(ts).isoformat() # "2018-05-24T19:54:48"
答案 4 :(得分:2)
有一条没有使用熊猫的路线;但请参阅下面的警告。
嗯,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)
会产生1341100800000000000L
。原因是datetime.datetime
对象无法准确表示纳秒级或更精细的时间刻度,因为datetime.datetime
支持的分辨率仅为微秒。
附注2 :注意numpy 1.10和早期版本与1.11及更高版本之间的不同约定:
在numpy&lt; = 1.10中,datetime64在内部存储为UTC,并打印为本地时间。如果没有指定TZ,则解析假定为本地时间,否则将考虑时区偏移。
在numpy&gt; = 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
。
答案 5 :(得分:0)
以this answer为基础,我将执行以下操作:
import numpy
import datetime
t = numpy.datetime64('2012-06-30T20:00:00.000000000')
datetime.datetime.fromtimestamp(t.item() / 10**9).strftime('%Y.%m.%d')
十亿分之一是将纳秒转换为秒。