如何将日期数组(格式为'mm/dd/yy HH:MM:SS')转换为数值?
我最近(大约一周前)决定把我的工作从matlab转到Python。因为我习惯用matlab,所以有时候在Python中找到我想要做的事情的确切对应方法会有点困难。
这是我的问题:
我有一组csv文件想要处理。目前为止,我已经成功地把它们加载成了几个组。每一列的数据量都超过了600000行。在其中一列的csv文件中,有一个时间列,格式是'mm/dd/yy HH:MM:SS'。我想把这个时间列转换成数字,我正在使用matplotlib库中的date2num来实现这个转换。请问有没有一种“矩阵”的方式来做到这一点?在matlab中,执行这个操作的命令是datenum(time, 'mm/dd/yyyy HH:MM:SS'),其中time是一个600000 x 1的矩阵。
谢谢
以下是我提到的代码示例:
import csv
import time
import datetime from datetime
import date from matplotlib.dates
import date2num
time = []
otherColumns = []
for d in csv.DictReader(open('MyFile.csv')):
time.append(str(d['time']))
otherColumns.append(float(d['otherColumns']))
timeNumeric = date2num(datetime.datetime.strptime(time,"%d/%m/%y %H:%M:%S" ))
2 个回答
0
在Python中,最接近matlab的矩阵/向量操作的就是列表推导式。如果你想对列表中的每个项目应用一个Python函数,你可以这样做:
new_list = [date2num(data) for data in old_list]
或者
new_list = map(date2num, old_list)
0
你可以使用生成器:
def pre_process(dict_sequence):
for d in dict_sequence:
d['time'] = date2num(datetime.datetime.strptime(d['time'],"%d/%m/%y %H:%M:%S" ))
yield d
现在你可以处理你的csv文件了:
for d in pre_process(csv.DictReader(open('MyFile.csv'))):
process(d)
这个方法的好处是,它不会复制可能很大的数据序列。
编辑:
所以你是想把文件的内容放到一个numpy数组里吗?
reader = csv.DictReader(open('MyFile.csv'))
#you might want to get rid of the intermediate list if the file is really big.
data = numpy.array(list(d.values() for d in pre_process(reader)))
现在你有了一个很大的数组,可以进行各种操作。你只想要第一列,以得到一个600000x1的矩阵:
data[:,0] # assuming time is the first column