在NumPy中将文本转换为datetime64

3

我有一个字符串的numpy数组(顺便问一句,为什么字符串被表示为对象?!)

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中,我找不到绘制日期直方图的方法。

1个回答

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数组。另外,它非常慢。 - Hanan Shteingart
@HananShteingart,获取其余部分基本上与您自己的代码相同。 - Padraic Cunningham
那这并不是一个真正的解决方案。有没有一种直接将这样的字符串格式化为numpy的方法? - Hanan Shteingart
@HananShteingart,我认为你会发现这个编辑速度要快得多。 - Padraic Cunningham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接