【问题标题】:converting text to datetime64 in numpy在numpy中将文本转换为datetime64
【发布时间】:2014-10-17 17:47:13
【问题描述】:

我有 numpy 字符串数组(ps 为什么字符串表示为对象?!)

t = array(['21/02/2014 08:40:00 AM', '11/02/2014 10:50:00 PM',
           '07/04/2014 05:50:00 PM', '17/02/2014 10:20:00 PM',
           '07/03/2014 06:10:00 AM', '02/03/2014 12:25:00 PM',
           '05/02/2014 03:20:00 AM', '31/01/2014 12:30:00 AM',
           '28/02/2014 01:25:00 PM'], dtype=object)

我想将它转换为具有日期分辨率的 numpy.datetime64,但是我找到的唯一解决方案是:

t = [datetime.strptime(tt,"%d/%m/%Y %H:%M:%S %p") for tt in t]
t = np.array(t,dtype='datetime64[us]').astype('datetime64[D]')

还能比这更丑吗?为什么我需要通过原生 Python 列表? 一定有别的办法……

顺便说一句,我找不到在 numpy/pandas 中绘制日期直方图的方法

【问题讨论】:

    标签: python arrays date datetime numpy


    【解决方案1】:

    日期格式是问题,01/01/2015 不明确,如果它在 ISO 8601 中,您可以直接使用 numpy 解析它,在您的情况下,因为您只需要日期,然后拆分和重新排列数据会明显更快:

    t = np.array([datetime.strptime(d.split(None)[0], "%d/%m/%Y") 
    for d in t],dtype='datetime64[us]').astype('datetime64[D]')
    

    一些时序,先解析后重新排列:

    In [36]: %%timeit
    from datetime import datetime
    t = np.array(['21/02/2014 08:40:00', '11/02/2014 10:50:00 PM',
               '07/04/2014 05:50:00 PM', '17/02/2014 10:20:00 PM',
               '07/03/2014 06:10:00 AM', '02/03/2014 12:25:00 PM',
               '05/02/2014 03:20:00 AM', '31/01/2014 12:30:00 AM',
               '28/02/2014 01:25:00 PM']*10000)
    t1 = np.array([np.datetime64("{}-{}-{}".format(c[:4], b, a)) for a, b, c in (s.split("/", 2) for s in t)])
    ....: 
    10 loops, best of 3: 125 ms per loop
    

    您的代码:

    In [37]: %%timeit
    from datetime import datetime
    t = np.array(['21/02/2014 08:40:00 AM', '11/02/2014 10:50:00 PM',
               '07/04/2014 05:50:00 PM', '17/02/2014 10:20:00 PM',
               '07/03/2014 06:10:00 AM', '02/03/2014 12:25:00 PM',
               '05/02/2014 03:20:00 AM', '31/01/2014 12:30:00 AM',
               '28/02/2014 01:25:00 PM']*10000)
    t = [datetime.strptime(tt,"%d/%m/%Y %H:%M:%S %p") for tt in t]
    t = np.array(t,dtype='datetime64[us]').astype('datetime64[D]')
    ....: 
    1 loops, best of 3: 1.56 s per loop
    

    两者给出相同结果的显着差异:

    In [48]: t = np.array(['21/02/2014 08:40:00 AM', '11/02/2014 10:50:00 PM',
                  '07/04/2014 05:50:00 PM', '17/02/2014 10:20:00 PM',
                  '07/03/2014 06:10:00 AM', '02/03/2014 12:25:00 PM',
                  '05/02/2014 03:20:00 AM', '31/01/2014 12:30:00 AM',
                  '28/02/2014 01:25:00 PM'] * 10000)
    
    In [49]: t1 = [datetime.strptime(tt,"%d/%m/%Y %H:%M:%S %p") for tt in t]
    t1 = np.array(t1,dtype='datetime64[us]').astype('datetime64[D]')
       ....: 
    
    In [50]: t2 = np.array([np.datetime64("{}-{}-{}".format(c[:4], b, a)) for a, b, c in (s.split("/", 2) for s in t)])
    
    In [51]: (t1 == t2).all()
    Out[51]: True
    

    【讨论】:

    • 感谢 Padraic,但这只会创建一个“datetime.datetime”数组而不是 datetime64 数组。 p.s.速度很慢。
    • @HananShteingart,剩下的和自己的代码基本一样
    • 那不是真正的解决方案。有没有办法将这些字符串直接格式化为 numpy?
    • @HananShteingart,我想你会发现编辑速度快了很多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    相关资源
    最近更新 更多