【问题标题】:How to convert numpy datetime64 [ns] to python datetime?如何将 numpy datetime64 [ns] 转换为 python datetime?
【发布时间】:2019-03-29 15:21:33
【问题描述】:

我需要在单独的函数中从 pandas 框架值转换日期:

 def myfunc(lat, lon, when):
        ts = (when - np.datetime64('1970-01-01T00:00:00Z','s')) / np.timedelta64(1, 's')
        date = datetime.datetime.utcfromtimestamp(ts)
        print("Numpy date= ", when, " Python date= ", date)
        return float(90) - next_func(lat, lon, date)

调用这个函数:

new_df['new_column'] =  np.vectorize(my_func)(lat, lon, new_df['datetime(LT)'])  

但它会引发错误:

ufunc subtract cannot use operands with types dtype('int64') and dtype('<M8[s]')

如何将 numpy datetime64 [ns] 转换为 python datetime?

【问题讨论】:

  • 欢迎来到地狱!提出这个概念的人应该受到鞭笞的招待 ;) .... 你使用的是哪个 pandas / numpy 版本?行为会随着不同的 numpy 版本而变化,以获得额外的乐趣
  • np.datetime64('1970-01-01','s').item() 返回datetime.datetime(1970, 1, 1, 0, 0)。 'ns' 返回一个整数,但 'us' 和更大的会产生 datetime
  • @ChristianSauer NumPy 是 1.15.3 而 Pandas 是 0.23.4

标签: python numpy


【解决方案1】:

我想知道您是否需要所有这些转换工作。使用正确的时间单位,datetime64 可以直接生成datetime 对象。

我不确定您的when 变量,但我们假设它来自pandas,类似于DatetimeIndex

In [56]: time = pandas.date_range('6/28/2013', periods=5, freq='5D')
In [57]: time
Out[57]: 
DatetimeIndex(['2013-06-28', '2013-07-03', '2013-07-08', '2013-07-13',
               '2013-07-18'],
              dtype='datetime64[ns]', freq='5D')

等价的numpy数组

In [58]: time.values
Out[58]: 
array(['2013-06-28T00:00:00.000000000', '2013-07-03T00:00:00.000000000',
       '2013-07-08T00:00:00.000000000', '2013-07-13T00:00:00.000000000',
       '2013-07-18T00:00:00.000000000'], dtype='datetime64[ns]')
In [59]: time.values.tolist()
Out[59]: 
[1372377600000000000,
 1372809600000000000,
 1373241600000000000,
 1373673600000000000,
 1374105600000000000]

[ns] 的结果是一个大整数,是某种“时间戳”。但是,如果我将时间单位转换为秒,甚至微秒(我们):

In [60]: time.values.astype('datetime64[s]')
Out[60]: 
array(['2013-06-28T00:00:00', '2013-07-03T00:00:00',
       '2013-07-08T00:00:00', '2013-07-13T00:00:00',
       '2013-07-18T00:00:00'], dtype='datetime64[s]')
In [61]: time.values.astype('datetime64[s]').tolist()
Out[61]: 
[datetime.datetime(2013, 6, 28, 0, 0),
 datetime.datetime(2013, 7, 3, 0, 0),
 datetime.datetime(2013, 7, 8, 0, 0),
 datetime.datetime(2013, 7, 13, 0, 0),
 datetime.datetime(2013, 7, 18, 0, 0)]

结果是datetime 对象的列表。

【讨论】:

    【解决方案2】:

    我更喜欢这种解决方法,因为有时 np.datetime64 具有不同的分辨率

    def ___convert_to_datetime(d):
        return datetime.strptime(np.datetime_as_string(d,unit='s'), '%Y-%m-%dT%H:%M:%S')
    

    时间戳

    def ___convert_to_ts(d):
        return datetime.strptime(np.datetime_as_string(d,unit='s'), '%Y-%m-%dT%H:%M:%S').timestamp()
    

    例如

    import numpy as np
    from datetime import datetime
    
    
    def ___convert_to_datetime(d):
      return datetime.strptime(np.datetime_as_string(d,unit='s'), '%Y-%m-%dT%H:%M:%S')
    
    
    
    def ___convert_to_ts(d):
      return datetime.strptime(np.datetime_as_string(d,unit='s'), '%Y-%m-%dT%H:%M:%S').timestamp()
    
    
    print(___convert_to_datetime(np.datetime64('2005-02-25')))
    
    my_ns_date = np.datetime64('2009') + np.timedelta64(20, 'ns')
    
    print(my_ns_date)
    
    print(___convert_to_datetime(my_ns_date))
    

    输出将是

    2005-02-25 00:00:00

    2009-01-01T00:00:00.000000020

    2009-01-01 00:00:00

    【讨论】:

      【解决方案3】:
      def myfunc(lat, lon, when):
          ts = (when - np.datetime64('1970-01-01T00:00:00Z','s')) / np.timedelta64(1, 's')
          date = datetime.utcfromtimestamp(ts)
          print("Numpy date= ", when, " Python date= ", date)
          return float(90) - next_func(lat, lon, date)
      

      试试这个代码

      要将 numpy datetime64[ns] 转换为 python datetime,您只需尝试以下代码段

      from datetime import datetime
      datetime.utcfromtimestamp('your_time_stamp')
      

      【讨论】:

      • 输出是什么
      猜你喜欢
      • 2017-01-05
      • 2020-11-05
      • 2015-06-27
      • 2015-11-02
      • 2021-09-27
      • 2022-08-15
      • 2020-04-28
      • 2019-05-22
      • 1970-01-01
      相关资源
      最近更新 更多