【问题标题】:index column not being parsed as date索引列没有被解析为日期
【发布时间】:2014-08-19 20:17:59
【问题描述】:

当我导入一些记录时,read_csv 将索引列正确读取为日期时间。 但是如果记录数超过几千条,那么索引列似乎会自动更改为对象而不是时间。

import pandas as pd

myheader=['ticketId' ,  ... a lot of columns ... ,  'serialNo']

users=pd.read_csv('ticketold_head.txt', sep='\t', header=None, names = myheader, parse_dates={'datetime1' : ["ticketDate", "ticketTime"]}, keep_date_col=True,  index_col='datetime1')

In [36]: users.index
Out[36]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2011-04-06 10:48:49, ..., 2011-04-07 10:14:17]
Length: 10000, Freq: None, Timezone: None

如果记录太多,则将索引类型更改为对象而不是日期时间。

In [40]: users.index
Out[40]: Index([u'2011-04-06 10:48:49', u'2011-04-06 10:48:51', 
...
...
 u'2011-04-06 12:32:21', ...], dtype='object')

【问题讨论】:

  • 您确定所有值都有效吗?如果你做df.index = pd.to_datetime(df.index),它也会失败吗?
  • 即使使用了 to_datetime 方法,它仍然是对象而不是时间序列。这是否意味着我的日期无效?我怎么知道有多少无效日期?有没有办法删除这些记录?
  • 您有无效的日期条目,您可以对数据进行二进制切割,找到行数,读取前半部分,然后读取第二部分,然后继续直到找到错误的行。或者您可以一次读取一行并存储无法转换的错误行。

标签: python pandas


【解决方案1】:

虽然自定义解析器有效,但我认为更快的路径可能是在您读取数据时不进行解析,像这样设置索引。 coerce=True 将错误值强制为 NaT

df.index = pd.to_datetime(df["ticketDate"] + df["ticketTime"], coerce=True, format='%Y-%m-%d %H:%M:%S')

【讨论】:

    【解决方案2】:

    需要一个函数来检查日期格式。将它与 to_read 一起使用为 date_parser=mydate

    def mydate(x):
        try:
            return dt.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
        except ValueError:
            return pd.NaT
    

    【讨论】:

      猜你喜欢
      • 2013-10-30
      • 2020-01-13
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2022-06-11
      • 1970-01-01
      相关资源
      最近更新 更多