python - 在numpy中将文本转换为datetime64

标签 python arrays date datetime numpy

我有 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]')

还有比这更丑陋的吗?为什么我需要遍历 native Python 列表? 必须有另一种方式......

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

最佳答案

日期格式是问题所在,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

关于python - 在numpy中将文本转换为datetime64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25471299/

相关文章:

python - 判断一个句子是英文概率的比较简单的方法是什么?

arrays - VB6中如何判断数组是否已初始化?

java - 不同时区的两个 java 日期之间经过的天数

java - Android 中的日期格式

php mysql 日期过滤产生了一些问题

python - 按前 X 个关键字符求和值 (Python)

javascript - 原子编辑器 : node-gyp rebuild crashes

python - 分布式时如何划分数据集

javascript - 具有三元运算符语法的 typeof Float32Array

java - Double 不能取消引用 [Arraylist]