如何将Python中以文本导入的数据分离为日期数组和数值数据

1 投票
2 回答
723 浏览
提问于 2025-04-17 12:02

我有一个Excel表格,第一列是日期,后面的列是每个属性的数值。我用read/readlines函数把整个数据集导入了。

我该怎么把导入的数据分开,得到一个日期数组(就是导入数据集中的第一列)和一个单独的数值矩阵(我想要处理的数据)呢?

举个例子:

我导入的数据如下:

观察日期 属性1 属性2 属性3

01/01/2012 105 101 100

02/01/2012 101 101 95

03/01/2012 98 95 97

我想从这些数据中创建以下内容:

日期数组 = [01/01/2012, 02/01/2012, 03/01/2012]

             105        101         100   

数值矩阵 = 101 101 95

             98         95          97

2 个回答

0

如果你已经在用numpy,这里有个“numpythonic”的解决方案……(不过如果你不使用numpy,其他方案可能更好。)

在最近的numpy版本中,新增了一个日期时间的数据类型(dtype)。在这之前,最常用的解决办法是使用matplotlib的日期格式(这其实是一个浮点数)。

首先,如果你想依赖matplotlib的日期格式,可以这样做:

import matplotlib.dates as mdates
import numpy as np

data = np.loadtxt('data.txt', converters={0:mdates.datestr2num})
dates = data[:,0]
data = data[:,1:]

在更新的numpy版本中,你可能想用datetime64这种数据类型来处理日期数组。在这种情况下(需要两次遍历):

import numpy as np
dates = np.loadtxt('data.txt', dtype=np.datetime64, usecols=[0])
data = np.loadtxt('data.txt', converters={0:lambda x: -9999.9})
data = data[:,1:]
1

这些列表推导式应该能满足你的需求(假设数据在testdata.xls文件中,并且是用制表符分隔的):

with open("testdata.xls") as inf:
    next(inf)
    lines = [l[:-1].split("\t") for l in inf]

date_array_list = [l[0] for l in lines]
values_matrix = [map(int, l[1:]) for l in lines]

print date_array_list
print values_matrix

这段代码会输出:

['01/01/2012', '02/01/2012', '03/01/2012']
[[105, 101, 100], [101, 101, 95], [98, 95, 97]]

撰写回答