解释我的整个困境,并且我使用的是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。
答案 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'