【问题标题】:Error when parsing timestamp with pandas read_csv使用 pandas read_csv 解析时间戳时出错
【发布时间】:2017-03-06 00:11:48
【问题描述】:

我正在尝试加载格式如下的 csv 文件:

                  40010  40015  40020  40025  40030  40035  40040  40045  
2008-11-03 00:00    786    212    779    227    220    131    680   1006   
2008-11-03 00:03    760    200    765    234    225    133    694   1063   
2008-11-03 00:06    757    205    769    237    230    136    726   1051   
2008-11-03 00:09    781    207    765    240    235    137    711   1040   
2008-11-03 00:12    759    203    751    232    225    134    717   1088
...

文件以逗号分隔。这里没有固定宽度。

我希望行索引是日期时间,所以这是我在加载文件时正在做的事情:

def dateparse (timestamp):   
    return datetime.datetime.strptime(timestamp, '%Y-%m-%d %I:%M')

global_data_train = pd.read_csv('RTAHistorical.csv', sep=",",parse_dates=True, date_parser=dateparse, header=0, index_col=0, skip_blank_lines = True, engine='python')

但我收到以下错误:

TypeError: strptime() argument 1 must be str, not numpy.ndarray

正如我看到some people 成功使用相同的方法,我不太明白这个错误。

我做错了什么?

【问题讨论】:

  • 尝试global_data_train = pd.read_csv('RTAHistorical.csv', sep=",",parse_dates=[0], header=0, index_col=0, skip_blank_lines = True, engine='python') 同样默认header 被默认为0 行,你可能不需要engine='python',因为它会尝试c-engine并回退到python在您尝试一些花哨的分隔符的情况下,同样您不需要在此处指定 separator arg,因为它默认为逗号。另外,您发布的原始数据是什么样的?如果是这样,它看起来像一个固定宽度的文件
  • 那行得通。 read_csv 的文档说:boolean:如果为真 -> 尝试解析索引。 整数或名称列表 -> 尝试将第 1、2、3 列分别解析为单独的日期列。那么doingparse_dates=[0]parse_dates=True有什么区别呢?
  • 我认为当您尝试指定 dateparser func 并告诉它 parse_dates=True 并指定 index_col 时存在错误,如果您的格式可以由内置 dateparser 处理,那么您可以只需指定索引 col 索引 date_parse=[0]index_col=[0] args 它就可以工作,无需过度复杂化

标签: python csv datetime pandas


【解决方案1】:

对我来说,作品格式更改为%Y-%m-%d %H:%M

def dateparse (timestamp):   
    return pd.datetime.strptime(timestamp, '%Y-%m-%d %H:%M')

示例:

import pandas as pd
from pandas.compat import StringIO

temp=u"""40010,40015,40020,40025,40030,40035,40040,40045
2008-11-03 00:00,786,212,779,227,220,131,680,1006
2008-11-03 00:03,760,200,765,234,225,133,694,1063
2008-11-03 00:06,757,205,769,237,230,136,726,1051
2008-11-03 00:09,781,207,765,240,235,137,711,1040
2008-11-03 00:12,759,203,751,232,225,134,717,1088"""
#after testing replace StringIO(temp) to filename
def dateparse (timestamp):   
    return pd.datetime.strptime(timestamp, '%Y-%m-%d %H:%M')

global_data_train = pd.read_csv(StringIO(temp), 
                                sep=",", 
                                parse_dates=True, 
                                date_parser=dateparse, 
                                header=0, 
                                index_col=0, 
                                skip_blank_lines = True, 
                                engine='python')
print (global_data_train)
                     40010  40015  40020  40025  40030  40035  40040  40045
2008-11-03 00:00:00    786    212    779    227    220    131    680   1006
2008-11-03 00:03:00    760    200    765    234    225    133    694   1063
2008-11-03 00:06:00    757    205    769    237    230    136    726   1051
2008-11-03 00:09:00    781    207    765    240    235    137    711   1040
2008-11-03 00:12:00    759    203    751    232    225    134    717   1088

print (global_data_train.index)
DatetimeIndex(['2008-11-03 00:00:00', '2008-11-03 00:03:00',
               '2008-11-03 00:06:00', '2008-11-03 00:09:00',
               '2008-11-03 00:12:00'],
              dtype='datetime64[ns]', freq=None)

也可以省略date_parser=dateparse

import pandas as pd
from pandas.compat import StringIO

temp=u"""40010,40015,40020,40025,40030,40035,40040,40045
2008-11-03 00:00,786,212,779,227,220,131,680,1006
2008-11-03 00:03,760,200,765,234,225,133,694,1063
2008-11-03 00:06,757,205,769,237,230,136,726,1051
2008-11-03 00:09,781,207,765,240,235,137,711,1040
2008-11-03 00:12,759,203,751,232,225,134,717,1088"""
#after testing replace StringIO(temp) to filename
global_data_train = pd.read_csv(StringIO(temp), 
                                parse_dates=True, 
                                skip_blank_lines = True)
print (global_data_train)
                     40010  40015  40020  40025  40030  40035  40040  40045
2008-11-03 00:00:00    786    212    779    227    220    131    680   1006
2008-11-03 00:03:00    760    200    765    234    225    133    694   1063
2008-11-03 00:06:00    757    205    769    237    230    136    726   1051
2008-11-03 00:09:00    781    207    765    240    235    137    711   1040
2008-11-03 00:12:00    759    203    751    232    225    134    717   1088

print (global_data_train.index)
DatetimeIndex(['2008-11-03 00:00:00', '2008-11-03 00:03:00',
               '2008-11-03 00:06:00', '2008-11-03 00:09:00',
               '2008-11-03 00:12:00'],
              dtype='datetime64[ns]', freq=None)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 2018-06-20
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多