2015-05-10 52 views
1

我有很長的數據幀中的日期列表需要轉換爲datetime,日期的格式爲「%d%m%Y」,我申請datetime.strptime(x,'%d%m%Y')一天使用strptime的月份超出範圍

day is out of range for month 

它是:直到滿足日期「3122012」,這應該是datetime.datetime(2012,12,3,0,0),而是它拋出錯誤消息的正常工作顯然是因爲該計劃將其視爲2012年3月31日,這並不存在。任何建議,以避免這種問題?謝謝!

+1

不應該是「03122012」嗎? – jonrsharpe

+0

據說'3122012'是我的,有什麼建議嗎?有時候你的數據不是理想的格式... – user6396

+0

你有沒有試過編寫自己的解析器,而不是依靠'datetime.strptime'(它需要格式良好的輸入)? – jonrsharpe

回答

3

這只是一個更大問題的一部分:您的格式本質上是不明確的。 *

例如,1-11-201211-1-2012都將格式化爲1112012。那麼,你將如何解析?您可以爲此創建和實施消歧規則,但無論您選擇哪一個,其他日期都不能再由您的系統代表。

如果這對你沒問題,那麼無論你爲消除歧義1112012實施的規則是否也會自動處理3122012。例如:

def parse_dmy(s): 
    if len(s) == 6: s = '0' + s[0] + '0' + s[1:] 
    elif len(s) == 7: s = '0' + s # or s[0] + '0' + s[1:] 
    return datetime.strptime(x, '%d%m%Y') 

我選擇了'0' + s規則,而不是s[0] + '0' + s[1:]規則,因爲前者給你03-12-2012在這個例子中,而後者給你31-02-2012。但是,再一次,這兩條規則都不適用於所有價值。


*此外,%d%m明確表示「填充0」,所以你的字符串在技術上是無效的......但大多數平臺都快樂地與非填充數字,例如,%d-%m-%Y - 我相信POSIX要求他們開心,Windows很開心,還有其他非POSIX平臺你關心什麼?無論如何,如果不是無法明確地將字符串轉換爲有效格式的較大問題,那只是一個小問題。

相關問題