我有很長的數據幀中的日期列表需要轉換爲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日,這並不存在。任何建議,以避免這種問題?謝謝!
我有很長的數據幀中的日期列表需要轉換爲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-11-2012
和11-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平臺你關心什麼?無論如何,如果不是無法明確地將字符串轉換爲有效格式的較大問題,那只是一個小問題。
不應該是「03122012」嗎? – jonrsharpe
據說'3122012'是我的,有什麼建議嗎?有時候你的數據不是理想的格式... – user6396
你有沒有試過編寫自己的解析器,而不是依靠'datetime.strptime'(它需要格式良好的輸入)? – jonrsharpe