python 如何将多种日期格式格式化为单个日期

How to format multiple date formats into single date in python

我在 Python 中有一个具有不同日期格式的列表:

list1 = ["30-4-1994", "1994-30-04", "30/04/1994",
         "30-apr-1994", "30/apr/1994","1994-30-apr"]

我想将多种日期格式格式化为单个日期,例如 dd-mm-yyyy

我该怎么做?

使用datetime.strptime

您必须配置这些日期格式。

示例:

>>> from datetime import datetime
>>> example_time = datetime.strptime("2018-01-01 00:00:00", "%Y-%m-%d %H:%M:%S")
>>> example_time
datetime.datetime(2018, 1, 1, 0, 0)
>>> datetime.strftime(example_time, "%d-%m-%Y")
'01-01-2018'

如果你只有有限的格式,你可以试试这个:

from datetime import datetime
list1=["30-4-1994","1994-30-04","30/04/1994","30-apr-
                     1994","30/apr/1994","1994-30-apr"]
for i in list1:
    for fmt in ('%Y-%m-%d', '%d-%m-%Y', '%d/%m/%Y',
                  '%Y-%d-%m', '%Y-%d-%b', '%d-%b-%Y', '%d/%b/%Y'):
        try:
           example_time =  datetime.strptime(i, fmt).date()
           final_output =  datetime.strftime(example_time, "%d-%m-%Y")
           print(final_output)
        except ValueError:
           continue

在理想情况下,您知道输入的格式

如果这是不可能的,我建议您使用第 3 方库来处理混合格式日期。

想到的两个库是dateutil(通过dateutil.parser.parse)和pandas(通过pandas.to_datetime)。下面是前者的示例实现。

请注意,唯一一次 parser.parse 不成功的情况必须通过 datetime.strptime 进行手动转换。 datetime 是标准 Python 库的一部分。

from datetime import datetime
from dateutil import parser

list1 = ["30-4-1994", "1994-30-04", "30/04/1994",
         "30-apr-1994", "30/apr/1994","1994-30-apr"]

def converter(lst):
    for i in lst:
        try:
            yield parser.parse(i)
        except ValueError:
            try:
                yield parser.parse(i, dayfirst=True)
            except ValueError:
                try:
                    yield datetime.strptime(i, '%Y-%d-%b')
                except:
                    yield i

res = list(converter(list1))

# [datetime.datetime(1994, 4, 30, 0, 0),
#  datetime.datetime(1994, 4, 30, 0, 0),
#  datetime.datetime(1994, 4, 30, 0, 0),
#  datetime.datetime(1994, 4, 30, 0, 0),
#  datetime.datetime(1994, 4, 30, 0, 0),
#  datetime.datetime(1994, 4, 30, 0, 0)]

然后您可以使用 datetime.strptime:

以任何您喜欢的方式格式化为字符串
res_str = [i.strftime('%d-%m-%Y') for i in res]

# ['30-04-1994',
#  '30-04-1994',
#  '30-04-1994',
#  '30-04-1994',
#  '30-04-1994',
#  '30-04-1994']

试试下面的代码:

list1=["30-4-1994","1994-30-04","30/04/1994","30-apr-1994","30/apr/1994","1994-30-apr"]

mt=['jan','feb','mar','apr','may','jun','jul','aug','sep','sept','oct','nov','dec' ] 
dict={'jan':'01','feb':'02','mar':'03','apr':'04','may':'05','jun':'06','jul':'07','aug':'08','sep':'09','sept':'09','oct':'10','nov':'11','dec':'12'}    

for i in range(0,len(list1)):
    a=list1[i]
    b= a.split('-')
    d= a.split('/')

    if len(b)==3:
        c=b
    if len(d)==3:
        c=d
    #-----for year
    if int(c[0]) in range(1000,3000):
            yyyy = c[0]
            del(c[0])

    elif int(c[2]) in range(1000,3000):
            yyyy = c[2]
            del(c[2])
    #--------
    #-----for date
    if len(c[0])<2:
            c[0] =int(c[0])
            dd='%02d' %c[0]
    else :
            dd=c[0]
    #-----for month       
    if len(c[1])<2:
            c[1] =int(c[1])
            mm='%02d' %c[1]
    elif len(c[1])>2:
            if isinstance(c[1], str)== True  and c[1] in mt:
                   k= c[1]
                   mm=dict[k]
    else :
            mm=c[1]
    print(dd,'-',mm,'-',yyyy)