【问题标题】:Can ndarray store datetime and float?ndarray 可以存储日期时间和浮点数吗?
【发布时间】:2017-11-09 19:00:23
【问题描述】:

如何制作这样一个可以同时存储日期时间和浮点数的 numpy 数据结构?

array([[ 2017-01-30 00:00:00,  1.0],
       [ 2017-01-31 00:00:00,  2.0]])

【问题讨论】:

  • 您是否尝试过将日期转换为浮点数并保存为数字?
  • np.datetime64 是一种存储日期的数据类型。但是要将它们放在与浮点数相同的数组中,您必须使用复合数据类型,即前面提到的structured array

标签: python numpy datetime multidimensional-array floating-point


【解决方案1】:

您可以将structured array 与异构元组一起使用:

import numpy as np
x = np.array([(np.datetime64('2017-01-30'), 1.0),
              (np.datetime64('2017-01-31'), 2.0)],
              dtype=[('datetime', 'datetime64[D]'), ('number', 'f8')])

语法有点类似dicts then:

>>> x['datetime']
array(['2017-01-30', '2017-01-31'], dtype='datetime64[D]')
>>> x['number']
array([ 1.,  2.])
>>> x['datetime'][0] + 5
numpy.datetime64('2017-02-04')
>>> x['number'][1] + 5
7.0

请注意,Pandas 可能更适合您的需求。

【讨论】:

    【解决方案2】:

    使用structured array

    import numpy as np
    
    desc = np.dtype([('date', '<M8[s]'), ('float', np.float64)])
    a = np.array([(np.datetime64('2017-01-30 00:00:00'),  1.0),
                  (np.datetime64('2017-01-31 00:00:00'),  2.0)], dtype=desc)
    print(a)
    print(repr(a))
    

    输出:

    [('2017-01-30T00:00:00',  1.) ('2017-01-31T00:00:00',  2.)]
    array([('2017-01-30T00:00:00',  1.), ('2017-01-31T00:00:00',  2.)], 
          dtype=[('date', '<M8[s]'), ('float', '<f8')])
    

    【讨论】:

    • Nitpick:您的示例给出了structured array,而不是record array。前者的Python类型为np.ndarray;后者的 Python 类型为 np.recarray
    • @MarkDickinson 感谢您的提示。已更正。
    【解决方案3】:

    这是不可能的,因为 ndarray 必须是同质的,即具有相同的数据类型。为了解决您的目的,您可以使用列表或元组而不是数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多