Если строка даты и времени в файле данных example.txt указана в виде одного столбца без разделительных пробелов, то genfromtxt
может преобразовать его в объект datetime, например:
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
Объединение двух столбцов в массиве может быть медленной операцией, особенно если массивбольшой.Это связано с тем, что слияние, как и изменение размера, требует выделения памяти для нового массива и копирования данных из исходного массива в новый.Поэтому я думаю, что стоит попытаться сформировать правильный массив numpy напрямую, а не поэтапно (путем формирования частично правильного массива и объединения двух столбцов).
Кстати, я проверял выше csv
код против слияния двух столбцов (ниже).Формирование одного массива из csv
(выше) было быстрее (и использование памяти было примерно таким же):
import matplotlib.cbook as mc
import numpy as np
import datetime as dt
def using_genfromtxt(fname):
data = np.genfromtxt(fname, dtype=None)
orig_desc=data.dtype.descr
view_desc=orig_desc[:2]+[('date','|S22')]+orig_desc[4:]
new_desc=orig_desc[:2]+[('date','|O4')]+orig_desc[4:]
newdata = np.empty(data.shape, dtype=new_desc)
fields=data.dtype.names
fields=fields[:2]+fields[4:]
for field in fields:
newdata[field] = data[field]
newdata['date']=np.vectorize(mkdate)(data.view(view_desc)['date'])
# print(mc.report_memory())
return newdata
# using_csv('example4096.txt')
# using_genfromtxt('example4096.txt')
example4096.txt
совпадает с example.txt
, дублируется 4096 раз.Это около 12 тысяч строк.
% 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