【问题标题】:parsing datestring in pandas在熊猫中解析日期字符串
【发布时间】:2014-02-20 07:12:01
【问题描述】:

对于多次提出已全面解决的问题,我深表歉意。我的问题是我试图复制粘贴来自 SO 帖子的示例,但对我没有任何帮助。我有“dd mm YYYY HH mm ss 值”形式的数据。我想把它读成一个熊猫数据框,第一列是一个日期字符串。以下是我从 SO 帖子中尝试的示例: 1. 第一个样本数据

01 05 2013 00 00 00     26.4    16.5
02 05 2013 00 00 00     25.9    17.7
03 05 2013 00 00 00     26.6    17.4
......

添加 HH mm ss 的零只是为了完全符合示例。

  1. 其次是导入的包

    从日期时间导入日期时间 将熊猫导入为 pd 导入操作系统 从 cStringIO 导入 StringIO

    fname = os.path.expanduser('./temps0.txt')

  2. 现在我尝试了三个例子

    一) 来自 SO 帖子:

    Parse dates when year month day and hour are in separate columns using pandas in python

    def dt_parse(date_string): dt = pd.datetime.strptime(date_string, '%d %m %Y') 返回 dt df = pd.read_csv(fname, header=None, index_col='datetime', parse_dates={'datetime': [0,1,2,4,5,6]}, date_parser=lambda x: pd.datetime.strptime(x, '%d %m %Y')) date_parser=dt_pasre)

这是错误的一部分

File "/home/zmumba/anaconda/lib/python2.7/site-packages/pandas/io/parsers.py",
 line 1763, in _try_convert_dates
    colnames.append(str(columns[c]))
IndexError: list index out of range

b) 另一个尝试,来自 SO 帖子:

https://stackoverflow.com/questions/11615504/parse-dates-when-yyyymmdd-and-hh-are-in-separate-columns-using-pandas-in-python

parse = lambda x: datetime.strptime(x, '%d%m%Y')
pd.read_table("./temps0.txt",  parse_dates = [['DD MM YYYY HH mm ss']],
                               index_col = 0,
                               date_parser=parse)

这是错误的一部分

File "/home/zmumba/anaconda/lib/python2.7/site-packages/pandas/io/parsers.py",
 line 1009, in _set
    self._reader.set_noconvert(names.index(x))
ValueError: 'DD MM YYYY HH mm ss' is not in list

c) 另一个尝试,来自 SO 帖子:

https://stackoverflow.com/questions/17301589/parsing-dd-mm-yy-hh-mm-ss-columns-from-txt-file-using-pythons-pandas?lq=1
def date_parser(ss):
    day, month, year, hour, min, sec = ss.split()
    return pd.Timestamp('20%s-%s-%s %s:%s:%s' % (year, month, day, hour, min, sec))
df = pd.read_csv('temps0.txt', header=None, sep='\s+\s', parse_dates=[[0]], date_parser=date_parser)

这是错误的一部分

File "<stdin>", line 2, in date_parser
ValueError: too many values to unpack

请原谅我的无知,因为我主要是通过 SO 帖子来学习(为了清晰起见,官方文档完全没有示例)。

【问题讨论】:

  • 如果您可以在 github 问题上发布您认为示例缺乏清晰性的地方,那将非常有帮助。 github.com/pydata/pandas/issues/new
  • 谢谢,我会这样做,但与此同时,我希望能在手头的问题上得到帮助

标签: python pandas


【解决方案1】:

Chang's answer 中,他使用了解析器,这是您需要调整以匹配日期字符串的日期格式的位:

import datetime
parse = lambda x: datetime.strptime(x, '%d %m %Y %H %M %S')

您还需要调整列名,在该示例中与格式相似,这有点令人困惑。这里我们没有列名,所以我们可以使用数字(对于列的位置,并告诉read_csv 使用 header=None):

from StringIO import StringIO
csv = '''01 05 2013 00 00 00,26.4,16.5
02 05 2013 00 00 00,25.9,17.7
03 05 2013 00 00 00,26.6,17.4'''

注意:我们使用 header=None,因为没有列名。

df = pd.read_csv(StringIO(csv), parse_dates=[0],
                                index_col=0,
                                date_parser=parse,
                                header=None)
In [11]: df
Out[11]:
               1     2
0                     
2013-05-01  26.4  16.5
2013-05-02  25.9  17.7
2013-05-03  26.6  17.4

如果您的数据由多个空格(两个以上)而不是逗号分隔,则使用 sep 参数:

csv = '''01 05 2013 00 00 00     26.4    16.5
02 05 2013 00 00 00     25.9    17.7
03 05 2013 00 00 00     26.6    17.4'''

In [21]: pd.read_csv(StringIO(csv), parse_dates = [0],
                           index_col = 0,
                           date_parser=parse,
                           header=None, sep='\s\s+')
Out[21]: 
               1     2
0                     
2013-05-01  26.4  16.5
2013-05-02  25.9  17.7
2013-05-03  26.6  17.4

注意:io docs 介绍了很多细节,并附有很多示例。

【讨论】:

    猜你喜欢
    • 2017-01-27
    • 2016-10-21
    • 2017-09-17
    • 2018-12-16
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    相关资源
    最近更新 更多