如何在Python中将带后缀的日期转换为另一种格式

1 投票
4 回答
1988 浏览
提问于 2025-04-19 07:53

我需要把类似下面的东西:

Mar 31st, 2014
Aug 13th, 2014
Sep 2nd, 2014

转换成:

31/03/2014
13/08/2014
2/09/2014

我一直在研究strptime这个函数,但后缀让我有点困扰。谢谢。

4 个回答

0

我会使用下面的方法。

import datetime
import re

# Collect all dates into a list.
dates = [ 'Mar 31st, 2014', 'Aug 13th, 2014', 'Sep 2nd, 2014' ]

# Compile a pattern to replace alpha digits in date to empty string.
pattern = re.compile('(st|nd|rd|th|,)')

# Itegrate through the list and replace the old format to the new one.
for offset, date in enumerate(dates):
    date = pattern.sub('', date)
    date = datetime.datetime.strptime(date, '%b %d %Y')
    dates[offset] = str(date.day) + '/' + str(date.month) + '/' + str(date.year)
    print(dates[offset]);
1

使用标准的Python模块时,主要的问题是没有选项可以让日期的天数带上后缀(比如“st”、“nd”、“th”等),而且也没有选项可以让天数不带前导零。关于后缀,你可以放心地删除它们,因为它们在月份名称中并不存在。至于不带前导零的天数,我们可以通过明确选择日期的各个部分来构造字符串。

from datetime import datetime 

def convert(dt_string, in_format='%b %d, %Y', out_format='{0.day}{0:/%m/%Y}'):
    for suffix in ('st', 'nd', 'rd', 'th'):
        dt_string = dt_string.replace(suffix, '')
    return out_format.format(datetime.strptime(dt_string, in_format))


dates = ['Mar 31st, 2014', 'Aug 13th, 2014', 'Sep 2nd, 2014']
print map(convert, dates)
1

你可以自己定义一个函数来完成这个任务:

d = {'Jan': '01', 'Feb': '02', 'Mar': '03', 'Apr': '04', 'May': '05', 'Jun': '06', 'Jul': '07', 'Aug': '08', 'Sep': '09', 'Oct': '10', 'Nov': '11', 'Dec': '12'}


def parser(date):
    date = date.split()    # date = ['Mar', '31st,', '2014']
    for i, elem in enumerate(date):
        if i == 0:
            month = d[elem]    # month = '03'
        elif i == 1:
            date = elem[:len(elem) - 3]    # date = '31'
        else:
            year = elem    # year = '2014'
    return date + "/" + month + "/" + year    # '31/03/2014'

print parser('Mar 31st, 2014')

这个函数会返回 31/03/2014

4

你可以使用 dateutil 这个模块:

>>> from dateutil.parser import parse
>>> s = 'Mar 31st, 2014'
>>> parse(s)
datetime.datetime(2014, 3, 31, 0, 0)

撰写回答