2016-06-07 151 views
-4

读书我一直在使用Python从CSV文件

pd.read_csv('file.csv',parse_dates=['date_time']) 

解析日期,然后运行DateTimeIndex从DATE_TIME可变的读取年,月,日的时候无法解析日期。如果正确完成,'date_time'应该被格式化为datetime64。但是在数据列中有一些东西是我不断获取'object'作为可变格式的,所以我在DateTimeIndex时收到ValueError。我的数据太大,无法找出究竟发生了什么。我应该如何处理这个问题,以便我可以将异常情况更改为丢失并获取解析的data_time变量?谢谢。

更新:

我做了什么Edchum建议除了漂亮的手动。这里是我猜为什么数据是不合理的:一个日期应该是2016年,而不是显示2161年。有谁知道为什么python不会在这种情况下解析日期时间?我如何识别与此类似的所有行并删除所有行?

+0

添加样本数据,万一有什么独特之处。检查parse_dates的语法。 – Merlin

+0

我尝试了线程中建议的方法,但得到了以下错误: – CWeeks

+0

OutOfBoundsDatetime:出界纳秒时间戳:1-255-255 00:00:00 – CWeeks

回答

2

输出试试这个:

import pandas as pd 
df = pd.read_csv('test.csv.gz', compression='infer',date_parser=True, usecols=([0,1,3])) 
print df.head() 

#  id   date_time posa_continent 
# 0 0 2015-09-03 17:09:54    3 
# 1 1 2015-09-24 17:38:35    3 
# 2 2 2015-06-07 15:53:02    3 
# 3 3 2015-09-14 14:49:10    3 
# 4 4 2015-07-17 09:32:04    3 
+0

这是一种简洁的方式来直接加载数据从gz文件。它仍然不能解决我的问题。道歉我在问题中引用了date_time(保持一般),但实际上srch_ci列(搜索签入日期)有问题。我更多地玩弄了数据,并确认这是一个特定的行(行ID = 312920)导致所有的麻烦。所以我删除了它,一切都很顺利。但感谢您的帮助! – CWeeks

+0

@CWlearner,如果一行编辑该行并重新加入。 – Merlin

+0

是的,我认为你是对的。我将改变它的价值,以便稍后处理。 – CWeeks

1

这将帮助您诊断问题。请运行该代码段和后期的bad_rows

df = pd.read_csv('file.csv') 
bad rows = [] 
good_rows = [] 
for row, date in enumerate(df['date_time']): 
    try: 
     good_rows.append((row,dateutil.parser.parse(date))) 
    except Exception as e: 
     print(str(e)) 
     bad_rows.append((row,date)) 
+0

我跑了代码但bad_rows似乎捕获所有行与good_rows捕获无.. – CWeeks

+0

编辑。请至少提供一些无法解析的'date'示例和相应的'Exception' –

+0

@michael_j_ward,感谢您的跟踪。我再次运行它,但再次出现错误。它说“ValueError:关闭文件上的I/O操作” – CWeeks