2016-12-29 82 views
0

我有一個日期列表,並想用下面的代碼把它轉換成一個日期:轉換日期時間列表爲日期蟒蛇

dates = (datetime.strptime(ts, '%Y-%m-%d %H:%M:%S') for ts in timestamps) 
date_strings = [datetime.strftime(d, '%m-%d-%Y') for d in dates] 

日期時間列表如下所示:

[datetime.datetime(2016, 11, 21, 0, 0), datetime.datetime(2016, 11, 22, 0, 0), datetime.datetime(2016, 11, 23, 0, 0)]

我收到以下錯誤信息:

TypeError: strptime() argument 1 must be str, not datetime.datetime

+0

'timestamps'已經是'datetime'對象的列表;或者更確切地說,*該列表中的至少一個對象*是一個'datetime'對象。你不能使用'datetime.strptime()'(注意那裏的*'p' *)將它們再次解析爲'datetime'對象*。 –

+0

你在日期列表中的理解無用地使用了一個未綁定的'datetime.strftime()'方法;只需在'datetime'實例上直接調用該方法即可。 –

回答

2

看樣子值在timestamps序列是不是字符串;他們已經是datetime的對象。你不需要進一步解析這些。也有可能你有混合的字符串和datetime對象;您看到的異常被拋出,因爲至少有一個值timestamps已經是datetime實例。

只需撥打的所有對象的datetime.strftime()methodts進行格式化:

date_strings = [d.strftime('%m-%d-%Y') for d in timestamps] 

演示:

>>> import datetime 
>>> timestamps = [datetime.datetime(2016, 11, 21, 0, 0), datetime.datetime(2016, 11, 22, 0, 0), datetime.datetime(2016, 11, 23, 0, 0)] 
>>> [d.strftime('%m-%d-%Y') for d in timestamps] 
['11-21-2016', '11-22-2016', '11-23-2016'] 

在你有一個字符串的混合timestampsdatetime情況下,事件,你將不得不做一些額外的處理:

def convert_as_needed(ts): 
    try: 
     # parse strings 
     datetime.strptime(ts, '%Y-%m-%d %H:%M:%S') 
    except TypeError: 
     # assume it is already a datetime object 
     return ts 

dates = map(convert_as_needed, timestamps) 
date_strings = [d.strftime('%m-%d-%Y') for d in dates] 
+0

非常感謝。這有幫助。 – MCM

+0

還有一個問題。轉換後,如何在日期中添加一天?使用datetime.timedelta(1)不起作用,因爲它現在是一個字符串。有一個簡單的工作嗎? – MCM

+0

在轉換爲字符串之前添加timedelta *。 '(d + timedelta(days = 1))。strftime('%m-%d-%Y')'可以讓你在一個表達式中執行這兩個操作。 –