【问题标题】:What happens when you cast date-time object to float当您将日期时间对象转换为浮动时会发生什么
【发布时间】:2020-05-21 18:25:13
【问题描述】:

正如您在附图中看到的,日期时间对象是“numpy.datetime64('2019-11-01T08:17:10.000000000')”,如果将其转换为浮点数,它将转换为 '1.57259623e+ 18',它看起来与原始的日期时间对象并不相似。Python 是如何从那个日期时间对象得到这个巨大的数字的?

【问题讨论】:

  • 请张贴代码而不是截图。然后我们可以复制/粘贴和实验。
  • numpy 对象经常有一个__float__ 方法,并且该方法的工作是确定“浮点”对数据类型的含义。 Python 本身不知道该怎么做。
  • 我不认为float [43] 有用。

标签: python numpy floating-point


【解决方案1】:

它是纳秒(1e9 纳秒在一秒内

>>> val = numpy.datetime64('2019-11-01T08:17:10.000000000').astype(float)
>>> datetime.datetime.fromtimestamp(val/1e9)
datetime.datetime(2019, 11, 1, 1, 17, 10)

(虽然我不确定为什么它与原始时间有 7 小时的偏移……可能与 UTC 或夏令时有关?)

是的 UTC

>>> datetime.datetime.utcfromtimestamp(val/1e9)
datetime.datetime(2019, 11, 1, 8, 17, 10)

【讨论】:

    【解决方案2】:

    这是一个时间戳,它是自纪元以来的秒数(一个固定的、任意时间点)。为datetime 和许多其他应用程序选择的纪元是 1970 年 1 月 1 日。

    【讨论】:

    • afaik 它的微秒:P(或者可能是皮秒......比秒增量小得多),result/1e9 = 我认为的秒
    【解决方案3】:
    In [563]: arr = np.array('2019-11-01T09:17:10', 'datetime64[us]')                        
    In [567]: arr                                                                            
    Out[567]: array('2019-11-01T09:17:10.000000', dtype='datetime64[us]')
    

    tolistitem 产生一个 datatime 对象:

    In [568]: arr.item()                                                                     
    Out[568]: datetime.datetime(2019, 11, 1, 9, 17, 10)
    

    将元素从其数组包装器中取出:

    In [569]: arr[()]                                                                        
    Out[569]: numpy.datetime64('2019-11-01T09:17:10.000000')
    

    我的 numpy 版本拒绝使用 float

    In [570]: float(arr[()])                                                                 
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-570-4e2ece106714> in <module>
    ----> 1 float(arr[()])
    
    TypeError: float() argument must be a string or a number, not 'datetime.datetime'
    

    astype(float) 确实有效:

    In [571]: arr.astype(float)                                                              
    Out[571]: array(1.57259983e+15)
    

    但如果我先转换时间单位:

    In [572]: arr.astype('datetime64[m]')                                                    
    Out[572]: array('2019-11-01T09:17', dtype='datetime64[m]')
    In [574]: arr.astype('datetime64[m]').astype(float)                                      
    Out[574]: array(26209997.)
    In [575]: arr.astype('datetime64[D]')                                                    
    Out[575]: array('2019-11-01', dtype='datetime64[D]')
    In [577]: arr.astype('datetime64[D]').astype(int)                                        
    Out[577]: array(18201)
    In [580]: arr.astype('datetime64[Y]')                                                    
    Out[580]: array('2019', dtype='datetime64[Y]')
    In [581]: arr.astype('datetime64[Y]').astype(int)                                        
    Out[581]: array(49)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2017-01-08
      • 2019-06-04
      • 2019-01-09
      • 2018-11-03
      • 2021-09-24
      • 1970-01-01
      相关资源
      最近更新 更多