【问题标题】:Parsing DD MM YY HH MM SS columns from TXT file using Python's pandas使用 Python 的 pandas 从 TXT 文件中解析 DD MM YY HH MM SS 列
【发布时间】:2013-06-25 15:37:14
【问题描述】:

提前感谢大家的宝贵时间。我有许多格式为空格分隔的文本文件;

    29 04 13 18 15 00    7.667
    29 04 13 18 30 00    7.000
    29 04 13 18 45 00    7.000
    29 04 13 19 00 00    7.333
    29 04 13 19 15 00    7.000

格式为 DD MM YY HH MM SS 和我的结果值。我正在尝试使用 Python 的 pandas 读取 txt 文件。在发布此问题之前,我已尝试对此进行大量研究,因此希望我没有涉及到踩踏的领域。

基于我的反复试验和研究:

    import pandas as pd
    from cStringIO import StringIO
    def parse_all_fields(day_col, month_col, year_col, hour_col, minute_col,second_col):
    day_col = _maybe_cast(day_col)
    month_col = _maybe_cast(month_col)
    year_col = _maybe_cast(year_col)
    hour_col = _maybe_cast(hour_col)
    minute_col = _maybe_cast(minute_col)
    second_col = _maybe_cast(second_col)
    return lib.try_parse_datetime_components(day_col, month_col, year_col, hour_col, minute_col, second_col)
    ##Read the .txt file
    data1 = pd.read_table('0132_3.TXT', sep='\s+', names=['Day','Month','Year','Hour','Min','Sec','Value'])
    data1[:10]

    Out[21]: 

    Day,Month,Year,Hour, Min, Sec, Value
    29 04 13 18 15 00    7.667
    29 04 13 18 30 00    7.000
    29 04 13 18 45 00    7.000
    29 04 13 19 00 00    7.333
    29 04 13 19 15 00    7.000

    data2 = pd.read_table(StringIO(data1), parse_dates={'datetime':['Day','Month','Year','Hour''Min','Sec']}, date_parser=parse_all_fields, dayfirst=True)

    TypeError                                 Traceback (most recent call last)
    <ipython-input-22-8ee408dc19c3> in <module>()
    ----> 1 data2 = pd.read_table(StringIO(data1), parse_dates={'datetime':   ['Day','Month','Year','Hour''Min','Sec']}, date_parser=parse_all_fields, dayfirst=True)

    TypeError: expected read buffer, DataFrame found

此时我被卡住了。首先,预期的读取缓冲区错误让我感到困惑。我是否需要对 .txt 文件进行更多预处理以将日期转换为可读格式?注意 - read_table 的 parse_function 在这种日期格式上不能单独工作。

我是初学者 - 正在努力学习。抱歉,如果代码错误/基本/令人困惑。如果有人可以提供帮助,将不胜感激。非常感谢。

【问题讨论】:

    标签: python datetime pandas


    【解决方案1】:

    我认为在读取 csv 时解析日期会更容易:

    In [1]: df = pd.read_csv('0132_3.TXT', header=None, sep='\s+\s', parse_dates=[[0]])
    
    In [2]: df
    Out[2]:
                        0      1
    0 2013-04-29 00:00:00  7.667
    1 2013-04-29 00:00:00  7.000
    2 2013-04-29 00:00:00  7.000
    3 2013-04-29 00:00:00  7.333
    4 2013-04-29 00:00:00  7.000
    

    由于您使用的是不寻常的日期格式,因此您还需要指定日期解析器:

    In [11]: 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))
    
    In [12]: df = pd.read_csv('0132_3.TXT', header=None, sep='\s+\s', parse_dates=[[0]], date_parser=date_parser)
    
    In [13]: df
    Out[13]:
                        0      1
    0 2013-04-29 18:15:00  7.667
    1 2013-04-29 18:30:00  7.000
    2 2013-04-29 18:45:00  7.000
    3 2013-04-29 19:00:00  7.333
    4 2013-04-29 19:15:00  7.000
    

    【讨论】:

    • 安迪,非常感谢你 - 我明白你做了什么 - 效果很好。
    猜你喜欢
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2018-11-08
    • 2013-07-22
    相关资源
    最近更新 更多