在python中将书面日期转换为日期格式

时间:2017-04-15 12:24:52

标签: python

解释我的整个困境,并且我使用的是python 2.7。

我有一个带有日期字段的adbode pdf表单doc,我使用pdfminer函数提取值。我需要解决的问题是,adobe arcobat阅读器中的用户可以键入类似于" 2017年4月3日和#34;或" 2017年4月3日"或者" 2017年4月3日"或" 04/04/2017"以及" 4 3 2017"。现在adobe中的日期字段设置为mm / dd / yyyy格式,因此当用户输入上述值之一时,这是pdfminer提取的实际值,但adobe将显示为04/03/2017,但是当您单击该字段时,将显示实际值,如上所示。 adobe允许这个,然后在转换时做它我想将日期显示为mm / dd / yyyy。有能力使用javascript与adobe进行更多控制,但我无法做到这一点,用户只能拥有并使用pdf表单,而无需任何附带的javascript文件。

所以我想找到一个在python中使用datetime的方法,它能够从一个字符串接受一个写日期,例如上面的例子,然后将它们转换成一个真正的mm / dd / yyyy格式???我看到了转换长短月名称的方法,但没有任何可以处理日期名称的方法,如第1,第2,第3,第4。

3 个答案:

答案 0 :(得分:1)

只需编写正则表达式即可从字符串中获取数字。

import re

s = '30Apr' 
n = s[:re.match(r'[0-9]+', s).span()[1]]
print(n) # Will print 30

其他事情应该很容易。

答案 1 :(得分:1)

您可以依次尝试每种可能的格式。首先删除所有st nd rd说明符,以便更轻松地进行测试:

from datetime import datetime

formats = ["%B %d %Y", "%d %B %Y", "%b %d %Y", "%m/%d/%Y", "%m %d %Y"]
dates = ["april 3rd 2017", "3rd April 2017", "Apr 3rd 2017", "04/04/2017", "4 3 2017"]

for date in dates:
    date = date.lower().replace("rd", "").replace("nd", "").replace("st", "")

    for format in formats:
        try:
            print datetime.strptime(date, format).strftime("%m/%d/%Y")
        except ValueError:
            pass

将显示:

04/03/2017
04/03/2017
04/03/2017
04/04/2017
04/03/2017

这种方法有利于验证每个日期。例如,一个月大于12.您可以标记所有允许格式失败的日期。

答案 2 :(得分:0)

基于@ MartinEvans的anwser,但是使用arrow库:(因为它处理的案例比datetime更多,所以你不必使用replace()lower()

首先安装箭头:

pip install arrow

然后尝试每种可能的格式:

import arrow

dates = ['april 3rd 2017', '3rd April 2017', 'Apr 3rd 2017', '04/04/2017', '4 3 2017']
formats = ['MMMM Do YYYY', 'Do MMMM YYYY', 'MMM Do YYYY', 'MM/DD/YYYY', 'M D YYYY']

def convert_datetime(date):
    for format in formats:
        try:
            print arrow.get(date, format).format('MM/DD/YYYY')
        except arrow.parser.ParserError:
            pass

[convert_datetime(date) for date in dates]

将输出:

04/03/2017
04/03/2017
04/03/2017
04/04/2017
04/03/2017

如果您不确定日期格式中可能出现的问题,如果日期都不符合格式,您还可以输出一条漂亮的错误消息:

def convert_datetime(date):
    for format in formats:
        try:
            print arrow.get(date, format).format('MM/DD/YYYY')
            break
        except (arrow.parser.ParserError, ValueError) as e:
            pass
    else:
        print 'For date: "{0}", {1}'.format(date, e)

convert_datetime('124 5 2017') # test invalid date

将输出以下错误消息:

'For date: "124 5 2017", month must be in 1..12'