如何将Python中以文本导入的数据分离为日期数组和数值数据
我有一个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]]