我正在使用Python2.7。
我有一个Adobe表单文档,其中有一个日期字段。我使用pdfminer函数提取值。我需要解决的问题是,Acrobat阅读器中的用户可以输入字符串,如april 3rd 2017或3rd April 2017、Apr 3rd 2017或04/04/2017以及4 3 2017。现在Adobe中的date字段设置为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这样的日名。
发布于 2017-04-15 12:56:51
您可以依次尝试每种可能的格式。首先,删除任何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个月。您可以标记所有允许的格式失败的日期。
发布于 2017-04-15 12:46:29
只需编写一个正则表达式,将数字从字符串中取出。
import re
s = '30Apr'
n = s[:re.match(r'[0-9]+', s).span()[1]]
print(n) # Will print 30其他的事情应该很容易。
发布于 2017-04-15 13:23:44
基于@MartinEvans的anwser,但使用arrow库:(因为它处理的情况比日期时间多,所以不必使用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'https://stackoverflow.com/questions/43426021
复制相似问题