【问题标题】:How to convert numpy datetime64 into datetime [duplicate]如何将 numpy datetime64 转换为 datetime [重复]
【发布时间】:2015-06-27 11:36:54
【问题描述】:

我基本上遇到了这里发布的同样问题:Converting between datetime, Timestamp and datetime64

但我找不到满意的答案,我的问题是如何从 numpy.datetime64 类型中提取日期时间:

如果我尝试:

np.datetime64('2012-06-18T02:00:05.453000000-0400').astype(datetime.datetime)

它给了我: 1339999205453000000L

我当前的解决方案是将 datetime64 转换为字符串,然后再次转换为 datetime。但这似乎是一种很愚蠢的方法。

【问题讨论】:

  • L 的值与您从 .tolist() 获得的值相同
  • 我从test 文件中发现,dtype 'M8[ms]' 很容易转换为datetime。
  • 阅读my answer to the end 了吗?您是否注意到不同的 numpy 版本在这里表现不同?答案包含不同numpy 版本的代码(版本是明确指定的)。甚至还有产生long 数字的代码示例,然后在这种情况下展示如何获取datetime。
  • 很抱歉,原始答案和这个答案都令人困惑。似乎有很多不同的方法可以做到这一点,我仍然不清楚如何将 numpy 日期时间转换为 pandas 日期时间的问题。例如,我不清楚下面的解决方案是否在说:pdDateTime = datetime.datetime.utcfromtimestamp(x.tolist()/1e9) ??

标签: python datetime numpy pandas


【解决方案1】:

从 Converting between datetime, Timestamp and datetime64

In [220]: x
Out[220]: numpy.datetime64('2012-06-17T23:00:05.453000000-0700')

In [221]: datetime.datetime.utcfromtimestamp(x.tolist()/1e9)
Out[221]: datetime.datetime(2012, 6, 18, 6, 0, 5, 452999)

考虑时区我认为这是正确的。不过看起来很笨重。

使用int() 比tolist()) 更明确(我认为):

In [294]: datetime.datetime.utcfromtimestamp(int(x)/1e9)
Out[294]: datetime.datetime(2012, 6, 18, 6, 0, 5, 452999)

或获取本地日期时间:

In [295]: datetime.datetime.fromtimestamp(x.astype('O')/1e9)

但在test_datatime.py 文件中 https://github.com/numpy/numpy/blob/master/numpy/core/tests/test_datetime.py

我找到了一些其他选项 - 首先将通用 datetime64 转换为指定单位的格式之一:

In [296]: x.astype('M8[D]').astype('O')
Out[296]: datetime.date(2012, 6, 18)

In [297]: x.astype('M8[ms]').astype('O')
Out[297]: datetime.datetime(2012, 6, 18, 6, 0, 5, 453000)

这适用于数组:

In [303]: np.array([[x,x],[x,x]],dtype='M8[ms]').astype('O')[0,1]
Out[303]: datetime.datetime(2012, 6, 18, 6, 0, 5, 453000)

【讨论】:

  • 所以long是单位为[ns]的结果
  • 谢谢。太棒了。
  • 乍一看,我认为x.tolist()/1e9 是一个错误,因为我没有注意到x 在你的情况下是一个标量。我强烈建议将其替换为x.item() 以澄清。
【解决方案2】:

请注意,Timestamp 是 datetime.datetime 的子类,因此 [4] 通常可以工作

In [4]: pd.Timestamp(np.datetime64('2012-06-18T02:00:05.453000000-0400'))
Out[4]: Timestamp('2012-06-18 06:00:05.453000')

In [5]: pd.Timestamp(np.datetime64('2012-06-18T02:00:05.453000000-0400')).to_pydatetime()
Out[5]: datetime.datetime(2012, 6, 18, 6, 0, 5, 453000)

【讨论】:

猜你喜欢
  • 2019-03-29
  • 1970-01-01
  • 2020-11-05
  • 2017-01-05
  • 2014-10-17
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 2020-05-04
相关资源
最近更新 更多