71

我无法将 pythondatetime64对象转换为字符串。例如:

t = numpy.datetime64('2012-06-30T20:00:00.000000000-0400')

进入:

'2012.07.01' as a  string. (note time difference)

我已经尝试将datetime64对象转换为datetimelong 然后转换为字符串,但我似乎收到此错误:

dt = t.astype(datetime.datetime) #1341100800000000000L
time.ctime(dt)
ValueError: unconvertible time
4

8 回答 8

88

解决方案是:

import pandas as pd 
ts = pd.to_datetime(str(date)) 
d = ts.strftime('%Y.%m.%d')
于 2013-10-21T19:32:45.420 回答
49

如果您不想进行转换 gobbledygook 并且只使用一种日期格式就可以了,这对我来说是最好的解决方案

str(t)[:10]
Out[11]: '2012-07-01'

如前所述,这也适用于熊猫

df['d'].astype(str).str[:10]
df['d'].dt.strftime('%Y-%m-%d') # equivalent
于 2017-08-03T20:32:39.713 回答
30

您可以使用 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'
于 2019-10-03T20:50:58.183 回答
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"
于 2018-05-31T13:29:58.930 回答
3

有一条不用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

于 2016-06-24T23:02:37.370 回答
1

t.item().strftime('%Y.%m.%d')

.item() 将numpy.datetime64转换为datetime.datetime,无需导入任何内容。

于 2021-11-02T01:45:21.177 回答
1

在此答案的基础上,我将执行以下操作:

import numpy
import datetime
t = numpy.datetime64('2012-06-30T20:00:00.000000000')
datetime.datetime.fromtimestamp(t.item() / 10**9).strftime('%Y.%m.%d')

除以十亿是从纳秒转换为秒。

于 2020-03-24T03:50:10.773 回答
0

此外,如果有人想对任何一系列日期时间数据框应用相同的公式,那么您可以按照以下步骤操作`

将熊猫导入为 pd

温度 = []

对于我在范围内(len(t[“myDate”])):

   ts = pd.to_datetime(str(t["myDate"].iloc[i])) 

   temp.append(ts.strftime('%Y-%m-%d'))

t [“我的日期”] = temp`

于 2021-10-19T11:53:39.953 回答