numpy ndarray中datetime对象的Python数组

numpy ndarray中datetime对象的Python数组,python,datetime,numpy,Python,Datetime,Numpy,我有一个numpy ndarray,它包含两列:一列是日期,例如2011-08-04,另一列是时间,例如19:00:00:081 如何将它们组合成一个datetime对象数组?目前,它们是numpy数组中的字符串。要回答这个问题,给定一个两列numpy数组a,您可以这样做 b = numpy.array([datetime.datetime.strptime(s + t, "%Y-%m-%d%H:%M:%S:%f") for s, t in a]) 由于注释表

我有一个numpy ndarray,它包含两列:一列是日期,例如2011-08-04,另一列是时间,例如19:00:00:081


如何将它们组合成一个datetime对象数组?目前,它们是numpy数组中的字符串。

要回答这个问题,给定一个两列numpy数组
a
,您可以这样做

b = numpy.array([datetime.datetime.strptime(s + t, "%Y-%m-%d%H:%M:%S:%f")
                 for s, t in a])
由于注释表明原始数组
a
是使用
genfromtxt()
构建的,因此最好在文本文件中加入列并定义合适的转换器(请参阅)

编辑:如果列的类型分别为注释中所示的
S10
S12
,则可以对此代码进行轻微优化,因为不需要显式连接列:

a = numpy.array([("2011-08-04", "19:00:00:081"), 
                 ("2011-08-04", "19:00:00:181")], 
                dtype=[("", "S10"), ("", "S12")])
b = numpy.array([datetime.datetime.strptime(s, "%Y-%m-%d%H:%M:%S:%f")
                 for s in a.view("S22")])

操作
a.view(“S22”)
成本低廉,因为它不复制数据。如果您的数组非常大,这种优化可能会受到欢迎,尽管它不会产生很大的影响。

如果数据文件中的日期和时间字符串作为一列给出,没有分隔的空格,那么
genfromtxt
可以将其转换为如下日期时间对象:

import numpy as np
import datetime as dt
def mkdate(text):
    return dt.datetime.strptime(text, '%Y-%m-%dT%H:%M:%S:%f')    
data = np.genfromtxt(
    'example.txt',
    names=('data','num','date')+tuple('col{i}'.format(i=i) for i in range(19)),
    converters={'date':mkdate},
    dtype=None)

给定
example.txt
,您可以使用

import numpy as np
import datetime as dt
import csv

def mkdate(text):
    return dt.datetime.strptime(text, '%Y-%m-%d%H:%M:%S:%f')    

def using_csv(fname):
    desc=([('data', '|S4'), ('num', '<i4'), ('date', '|O4')]+
          [('col{i}'.format(i=i), '<f8') for i in range(19)])
    with open(fname,'r') as f:
        reader=csv.reader(f,delimiter='\t')
        data=np.array([tuple(row[:2]+[mkdate(''.join(row[2:4]))]+row[4:])
                       for row in reader],
                      dtype=desc)
    # print(mc.report_memory())        
    return data
example4096.txt
example.txt
相同,重复了4096次。大约有12K行长

% python -mtimeit -s'import test' 'test.using_genfromtxt("example4096.txt")'
10 loops, best of 3: 1.92 sec per loop

% python -mtimeit -s'import test' 'test.using_csv("example4096.txt")'
10 loops, best of 3: 982 msec per loop

数组的
dtype
是什么?列是对象还是定长字符串字段?@Sven Marnach:这是@ykt:的延续:在创建原始文本文件时,能否删除
2011-08-04
19:00:08
之间的选项卡?如果没有空格,有一种巧妙的方法可以使用
np.genfromtxt
(无需合并列)形成正确的数组。@unutbu:不幸的是,没有,有数千个空格,还有更多的空格!不过,我也很想看看你的版本。如果
a
是你的数组,你可以使用
a.dtype
访问它的
dtype
。如果列是固定宽度的字符串列,这将允许进行较小的优化,因为我们可以通过重新解释数据跳过连接它们的步骤。如果它们是Python
str
对象,则这是不可能的。
% python -mtimeit -s'import test' 'test.using_genfromtxt("example4096.txt")'
10 loops, best of 3: 1.92 sec per loop

% python -mtimeit -s'import test' 'test.using_csv("example4096.txt")'
10 loops, best of 3: 982 msec per loop