如何将日期数组(格式为'mm/dd/yy HH:MM:SS')转换为数值?

1 投票
2 回答
2884 浏览
提问于 2025-04-17 08:56

我最近(大约一周前)决定把我的工作从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

撰写回答