首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用python将书面日期格式转换为日期格式

用python将书面日期格式转换为日期格式
EN

Stack Overflow用户
提问于 2017-04-15 12:24:52
回答 3查看 4.3K关注 0票数 1

我正在使用Python2.7。

我有一个Adobe表单文档,其中有一个日期字段。我使用pdfminer函数提取值。我需要解决的问题是,Acrobat阅读器中的用户可以输入字符串,如april 3rd 20173rd April 2017Apr 3rd 201704/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这样的日名。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-15 12:56:51

您可以依次尝试每种可能的格式。首先,删除任何st nd rd说明符,以使测试更容易:

代码语言:javascript
复制
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

它将显示:

代码语言:javascript
复制
04/03/2017
04/03/2017
04/03/2017
04/04/2017
04/03/2017

这种方法的好处是验证每个日期。例如,超过12个月。您可以标记所有允许的格式失败的日期。

票数 2
EN

Stack Overflow用户

发布于 2017-04-15 12:46:29

只需编写一个正则表达式,将数字从字符串中取出。

代码语言:javascript
复制
import re

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

其他的事情应该很容易。

票数 1
EN

Stack Overflow用户

发布于 2017-04-15 13:23:44

基于@MartinEvans的anwser,但使用arrow库:(因为它处理的情况比日期时间多,所以不必使用replace()lower())

第一个安装箭头:

代码语言:javascript
复制
pip install arrow

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

代码语言:javascript
复制
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]

将产出:

代码语言:javascript
复制
04/03/2017
04/03/2017
04/03/2017
04/04/2017
04/03/2017

如果您不确定日期格式中可能出错的是什么,您也可以输出一条很好的错误消息,如果没有一个日期与该格式匹配:

代码语言:javascript
复制
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

将输出以下错误消息:

代码语言:javascript
复制
'For date: "124 5 2017", month must be in 1..12'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43426021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档