【问题标题】:Convert numpy.datetime64 to string object in python在python中将numpy.datetime64转换为字符串对象
【发布时间】:2013-10-30 09:59:48
【问题描述】:

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

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

进入:

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

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

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

【问题讨论】:

  • stackoverflow.com/questions/13703720/… 对您的具体问题有帮助吗?
  • 谢谢,解决方案是:import pandas as pd ts = pd.to_datetime(str(date)) d = ts.strftime('%Y.%m.%d')
  • 还有更简单的方法,看看下面我的回答

标签: python date datetime numpy


【解决方案1】:

解决办法是:

import pandas as pd 
ts = pd.to_datetime(str(date)) 
d = ts.strftime('%Y.%m.%d')

【讨论】:

  • 由于某种原因这不起作用。 numpy.datetime64' 对象没有属性 'strftime'
  • @chemeng 你需要在numpy.datetime64 对象上运行pd.to_datetime,然后再执行.strftime
【解决方案2】:

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

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

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

df['d'].astype(str).str[:10]
df['d'].dt.strftime('%Y-%m-%d') # equivalent

【讨论】:

  • 这太疯狂了!多么有创意的解决方案!
  • 这也适用于pandas.Timestamp 对象,这对于保持纳秒或更小的精度很有好处,因为strftime 不支持这种精度级别。
【解决方案3】:

您可以使用 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'

【讨论】:

  • numpy 而不是 numpyp。或者import numpy as np 只是np.datetime...
  • 这是一个很好的方法!
【解决方案4】:

有一条不用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 类型,这就解释了为什么 @987654329 @ 产生 1341100800000000000L。原因是datetime.datetime对象无法准确表示纳秒或更精细的时间尺度,因为datetime.datetime支持的分辨率只有微秒。

旁注 2:注意 numpy 1.10 及更早版本与 1.11 及更高版本之间的不同约定:

  • 在 numpy

  • 在 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

【讨论】:

    【解决方案5】:

    我想要一个 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"
    

    【讨论】:

      【解决方案6】:

      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')
      

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

          将熊猫导入为 pd

          温度 = []

          for i in range(len(t["myDate"])):

             ts = pd.to_datetime(str(t["myDate"].iloc[i])) 
          
             temp.append(ts.strftime('%Y-%m-%d'))
          

          t["myDate"] = temp`

          【讨论】:

            猜你喜欢
            • 2021-08-03
            • 2011-04-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-16
            相关资源
            最近更新 更多