问题描述
需要将“ all_dates”中存在的字符串转换为日期格式。 我能够将它们全部转换为日期格式并在循环中打印。但是无法在循环外打印它们。我可以将“ AllDates”作为日期列表而不是字符串列表
from datetime import datetime,date
from dateutil.relativedelta import relativedelta
all_dates = ['06/11/2020','26/10/2018']
AllDates = []
for item in range(len(all_dates)):
dateinAT = datetime.strptime(newdate[item],'%d/%m/%Y').date()
print(dateinAT)
AllDates.append(dateinAT)
print(AllDates)
上述代码的输出: 2020-11-06 2018-10-26
[datetime.date(2020,11,6),datetime.date(2018,10,26)]
必需的输出:[2020-11-06,2018-10-26]
解决方法
OP明确表示希望保留AllDates
个date
对象的列表。所有其他答案都将其作为字符串列表
首先,重要的是要了解这只是一种表示形式。在循环内打印dateinAT
时,您将以datetime.date.__str__
返回的格式获得输出。但是,在循环之外打印AllDates
列表时,将以date
返回的格式获得每个datetime.date.__repr__
对象。
有关__str__
和__repr__
的更多信息,请参见Difference between __str__ and __repr__?。
清除这些内容后,如果您仍然认为值得将[2020-11-06,2018-10-26]
作为print(AllDates)
的输出,则可以通过使用自定义子类list
的类来实现__str__
的实现(它将使用每个元素的__str__
方法而不是__repr__
)。
from collections import UserList
class DatesList(UserList):
def __str__(self):
return '[' + ','.join(str(e) for e in self) + ']'
# as an exercise,change str(e) to repr(e) and see that you get the default output
all_dates = ['06/11/2020','26/10/2018']
AllDates = DatesList() # <- note we use our new class instead of list() or []
for item in range(len(all_dates)):
dateinAT = datetime.strptime(all_dates[item],'%d/%m/%Y').date()
AllDates.append(dateinAT)
print(AllDates)
print([type(e) for e in AllDates])
此输出
[2020-11-06,2018-10-26]
[<class 'datetime.date'>,<class 'datetime.date'>]
和保留AllDates
个date
对象的列表。
print()
调用datetime.date对象的__str__
方法。
一种快速但不太复杂的解决问题的方法是:
AllDates.append(dateinAT.__str__())
更好的版本是使用strftime
方法
AllDates.append(dateinAT.strftime("%Y-%m-%d"))
,
您将代码存储为datetime
值。因此,您需要使用str
将其转换为strftime
。
因此,将此行更改为
dateinAT = datetime.strptime(newdate[item],'%d/%m/%Y').date()
这个
dateinAT = datetime.strptime(newdate[item],'%d/%m/%Y').strftime('%Y-%m-%d')
,
使用列表理解:
>>> from datetime import datetime
>>> all_dates = ['06/11/2020','26/10/2018']
>>> AllDates = [
datetime.strptime(item,'%d/%m/%Y').date().strftime('%Y-%m-%d') for item in all_dates]
['2020-11-06','2018-10-26']