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

时间:2018-04-02 08:44:05

标签: python python-3.x datetime string-formatting

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

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

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

我该怎么做?

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

使用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'

答案 2 :(得分:0)

在理想的世界中,您知道输入的格式

如果无法做到这一点,我建议您使用第三方库来处理混合格式的日期。

我想到的两个图书馆是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']

答案 3 :(得分:0)

尝试以下代码:

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)