2016-06-07 117 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