【问题标题】:How to separate data imported as text in Python into datearray and numeric data如何将在 Python 中作为文本导入的数据分离为 datearray 和数字数据
【发布时间】:2012-02-23 08:58:19
【问题描述】:

我有一个 Excel 电子表格,第一列中有日期,其余的是观察到的每个属性的数值。我使用 read/readlines 函数导入了整个数据集。

如何将导入的数据分成 datearray(导入数据集中的第一列)和单独的数值矩阵(我要处理的数据)?

例如:

我正在导入以下数据:

ObservationDate Attribute1 Attribute2 Attribute3

2012 年 1 月 1 日 105 101 100

2012 年 2 月 1 日 101 101 95

2012 年 3 月 1 日 98 95 97

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

DateArrayList = [01/01/2012, 02/01/2012, 03/01/2012]

             105        101         100   

值矩阵 = 101 101 95

             98         95          97

【问题讨论】:

  • 不确定如何格式化数据——这是您想要的吗?
  • 到目前为止你尝试了什么?

标签: python excel import


【解决方案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]]

【讨论】:

  • 感谢您的及时回复。我尝试了您提供的代码,我没有收到错误,但打印的两个列表都是空的 - 我可能需要进一步调查。希望它会进一步提高我的理解。
  • 这可能与您的输入文件有关。您的输入文件是带有制表符分隔列的纯文本文件吗? (也就是说,您在 Excel 中创建的传统 .xls 文件不起作用 - 尝试将其内容复制到空文本文件中)
  • 谢谢。这适用于导入和分离日期向量,但我在行上遇到错误: values_matrix = [map(float,l[1:]) for l in lines] ,ValueError : 无法将字符串转换为浮点数。我必须做任何类型的演员吗?谢谢。
  • 这意味着您的输入文件中的某些值无法转换为浮点数。可能发生这种情况的一些原因:a) 标题行 b) 带有逗号的数字(如 1,000,000) c) 数字表中的值,如 NA 或 N/A。如果您发布输入文件的示例,我相信它会变得清晰
  • 谢谢。我想到了这一点,所以我写了一个 lamda 表达式来忽略 NA 类型。这效果很好!
【解决方案2】:

如果您已经在使用 numpy,这里是“numpythonic”解决方案...(虽然如果您不使用其他解决方案会更好。)

在最新版本的 numpy 中,有一个 datetime dtype。在此之前,最常见的解决方案是使用 matplotlib 的日期格式(即浮点数)。

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

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 dtype。在这种情况下(使用两次):

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:]

【讨论】:

  • 感谢您的回复。我都尝试了,但每个都有错误。使用第一种方法找不到 mdate。 float() 的文字无效:2012 年 1 月 1 日。有什么想法可能在这里发生吗?
  • 嗯,你首先需要matplotlib。该模块不是“mdates”,而是matplotlib.dates。我只是使用mdates 作为速记。仅当您使用 numpy 1.5 或更新版本时,第二个版本才有效。两者都假定日期列是 first 列。
猜你喜欢
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
相关资源
最近更新 更多