【问题标题】:numpy array item from type object cannot be converted to numpy.datetime64类型对象中的 numpy 数组项无法转换为 numpy.datetime64
【发布时间】:2021-06-21 14:54:15
【问题描述】:

我对 python 很陌生,并尝试了一些功能。我在这里搜索了很多可能的解决方案,但没有成功。这是我的问题:

目标:

  • 从 .xlsx 文件中读取包含日期和时间的列 --> 有效

  • 在 numpy 数组中获取此列 --> 有效

  • 数组项作为对象从 .xlsx 中读取

数组输出如下所示:

['2020-11-09 20:30:59' '2020-11-08 09:22:54' '2020-11-04 02:24:17' ...
 '1900-01-27 02:30:00' '1900-01-24 03:00:00' '1900-01-18 15:30:00']
  • 将日期和时间转换为浮点数-->不起作用

我尝试了以下方法:

x[:, 0] = [np.datetime64(x[:, 0])]

--> 这不起作用;所以我之前尝试过转换成String。

x[:, 0] = [np.datetime64(str(x[:, 0]))] 

--> 这也不适用于此错误消息:

ValueError: Error parsing datetime string "['2020-11-09 20:30:59' '2020-11-08 09:22:54' '2020-11-04 02:24:17' ...
 '1900-01-27 02:30:00' '1900-01-24 03:00:00' '1900-01-18 15:30:00']" at position 0

那么问题出在哪里?

非常感谢您的回答!它似乎适用于 datetime64 转换。我确实改变了。

np.array(alist, 'datetime64[ms]')

np.array(alist, 'datetime64[ns]')

我得到 datetime64 作为整数。然而,我怎么会在输出中看到早期日期的负值?

-----------------------------------------------------
--> Before conversion: ['2020-11-09 20:30:59' '2020-11-08 09:22:54' '2020-11-04 02:24:17' ...
 '1900-01-27 02:30:00' '1900-01-24 03:00:00' '1900-01-18 15:30:00']
-----------------------------------------------------
--> After conversion to dt64: [1604953859000000000 1604827374000000000 1604456657000000000 ...      
 -2206733400000000000 -2206990800000000000 -2207464200000000000]
-----------------------------------------------------

【问题讨论】:

  • 如果您想将数据类型更改为日期时间,您可以使用x.astype('datetime64[ms]’)
  • 第一个“不起作用”错误缺少详细信息 - 实际代码和错误消息。最后一种情况的错误应该很清楚。 str(x[:,0])""、括号、空格和 '' 字符串之间的所有内容。
  • 我想在机器学习模型中使用日期和时间作为浮点数,所以我需要转换为浮点数,然后在 cpnvert 上转换回日期和时间。
  • 重点是:如果你转换成整数,你会得到Unix time,这是相对时间到1970-01-01(“Unix时间纪元”),所以该日期之前的值将是负数。

标签: python string numpy datetime


【解决方案1】:

TLDR:

使用astype 转换为适当的类型:

import numpy as np

# array of dtype object (string)
arr = np.array(['2020-11-09 20:30:59', '2020-11-08 09:22:54', '2020-11-04 02:24:17',
                '1900-01-27 02:30:00', '1900-01-24 03:00:00', '1900-01-18 15:30:00'])

# to numpy's datetime, uses 'datetime64[s]' automatically
dtarr = arr.astype(np.datetime64)
# dtarr.dtype
# dtype('<M8[s]')

# to Unix time, using 1970-01-01 as epoch - values before the epoch are negative
dtarr_unix = dtarr.astype(np.int64) # datetime64[s] will give seconds since the epoch...
# array([ 1604953859,  1604827374,  1604456657, -2206733400, -2206990800,
#         -2207464200], dtype=int64)

# or using 1900-01-01 as epoch:
dtarr_1900 = (dtarr - np.datetime64('1900-01-01')).astype(np.int64)
# array([3813942659, 3813816174, 3813445457,    2255400,    1998000,
#           1524600], dtype=int64)

相关:How to get unix timestamp from numpy.datetime64

【讨论】:

    【解决方案2】:

    我想说datatime64 在转换字符串时可能很挑剔。它无法处理所有类型的分隔符。但是

    In [219]: alist = ['2020-11-09 20:30:59', '2020-11-08 09:22:54', '2020-11-04 02:24:17',
         ...:  '1900-01-27 02:30:00', '1900-01-24 03:00:00', '1900-01-18 15:30:00']
    In [220]: alist
    Out[220]: 
    ['2020-11-09 20:30:59',
     '2020-11-08 09:22:54',
     '2020-11-04 02:24:17',
     '1900-01-27 02:30:00',
     '1900-01-24 03:00:00',
     '1900-01-18 15:30:00']
    

    它可以很好地处理这种格式:

    In [221]: np.array(alist, 'datetime64[ms]')
    Out[221]: 
    array(['2020-11-09T20:30:59.000', '2020-11-08T09:22:54.000',
           '2020-11-04T02:24:17.000', '1900-01-27T02:30:00.000',
           '1900-01-24T03:00:00.000', '1900-01-18T15:30:00.000'],
          dtype='datetime64[ms]')
    

    此显示在日期和时间之间有一个“T”,但缺少它不是问题。

    转换回列表,它产生datatime 对象:

    In [222]: _.tolist()
    Out[222]: 
    [datetime.datetime(2020, 11, 9, 20, 30, 59),
     datetime.datetime(2020, 11, 8, 9, 22, 54),
     datetime.datetime(2020, 11, 4, 2, 24, 17),
     datetime.datetime(1900, 1, 27, 2, 30),
     datetime.datetime(1900, 1, 24, 3, 0),
     datetime.datetime(1900, 1, 18, 15, 30)]
    

    或者只是显示秒

    In [223]: np.array(alist, 'datetime64[s]')
    Out[223]: 
    array(['2020-11-09T20:30:59', '2020-11-08T09:22:54',
           '2020-11-04T02:24:17', '1900-01-27T02:30:00',
           '1900-01-24T03:00:00', '1900-01-18T15:30:00'],
          dtype='datetime64[s]')
    

    解析单个数据时间字符串

    In [235]: alist[0]
    Out[235]: '2020-11-09 20:30:59'
    In [236]: np.datetime64(alist[0])
    Out[236]: numpy.datetime64('2020-11-09T20:30:59')
    

    如果它是一个对象 dtype 数组(例如可能从数据帧中获取):

    In [254]: arr = np.array(alist, object)
    In [255]: arr
    Out[255]: 
    array(['2020-11-09 20:30:59', '2020-11-08 09:22:54',
           '2020-11-04 02:24:17', '1900-01-27 02:30:00',
           '1900-01-24 03:00:00', '1900-01-18 15:30:00'], dtype=object)
    In [256]: arr1 = arr.astype('datetime64[s]')
    In [257]: arr1
    Out[257]: 
    array(['2020-11-09T20:30:59', '2020-11-08T09:22:54',
           '2020-11-04T02:24:17', '1900-01-27T02:30:00',
           '1900-01-24T03:00:00', '1900-01-18T15:30:00'],
          dtype='datetime64[s]')
    

    【讨论】:

    • 非常感谢!它似乎工作。我确实改变了。然而,我怎么会在早期得到负值?
    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 2020-07-05
    • 2020-09-09
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多