使用 python strftime() 识别文本文件中月份和日期没有零填充的日期值

Identifying date values in a text file that do not have zero padding for month and day using python strftime()

我正在阅读一个文本文件,其中一列(第 3 列)包含不同日期格式的日期值以及其他数据类型(字符串、数字等)。我在我的输入文件中识别每个唯一的日期格式,并将每个日期格式的值输出到一个文本文件。我在我的输入文件中寻找的日期格式之一是 - Month dd, YYYY。

例如2001 年 5 月 1 日。

我正在使用 python strftime() 函数在我的文件中搜索上述日期格式。但是,我在下面提供的代码仅输出带有零填充的日期值。

例如2001 年 5 月 1 日

但是,我需要我的程序也能找到没有零填充的日期值,我知道我的输入文件中存在这样的日期值:

2001 年 5 月 1 日

2012 年 2 月 4 日

我在论坛上搜索了解决方案,其中大部分涉及 removing/replacing 零。但是,这并不能解决我的问题,因为我正在文件中搜索零填充和非零填充日期值。
我还尝试在我的日期格式中的“%”符号后添加“-”符号,但它没有用。我在下面提供了我的代码。谁能指导我正确的方向?我正在使用 Pycharm CE 2017.2 和 python 3.6.3 解释器。

我的代码:

# Identifying Month dd, yyyy date format

from datetime import datetime

import csv

with open('file1.csv', 'r') as f_input, open('file2.txt', 'w') as f_output:

    csv_input = csv.reader(f_input)
    csv_output = csv.writer(f_output)

    for row in csv_input:
        for date_format in ['%B %d, %Y']:
            try:
                converted = datetime.strptime(row[3], date_format)
                csv_output.writerow([row[0], row[1], row[2], converted.strftime(date_format), row[4]])
            except ValueError:
                pass

在 python 3.5.2 中测试(在 3.6 中应该相同)。我没有发现任何问题

>>> from datetime import datetime
>>> datetime.strptime('May 1, 2018', '%B %d, %Y')
datetime.datetime(2018, 5, 1, 0, 0)
>>> datetime.strptime('May 01, 2018', '%B %d, %Y')
datetime.datetime(2018, 5, 1, 0, 0)

您可能需要粘贴一些文件以更好地了解正在发生的事情。

编辑

这里是一个link到一个repl.it。感谢@usr2564301 告诉我这件事。

https://repl.it/@ryati/GrayIllinformedFlyingsquirrel

非常很难使用 datetime.strptime() 可靠地做你想做的事。我可以从您的代码中看到您已经计划拥有多个日期格式字符串(否则您的日期格式字符串不会在 1-list 中)。

试试这个方法:

>>> from dateutil import parser
>>> parser.parse("May 1, 2001")
datetime.datetime(2001, 5, 1, 0, 0)
>>> parser.parse("May 01, 2001")
datetime.datetime(2001, 5, 1, 0, 0)
>>> parser.parse("2/4/2012")
datetime.datetime(2012, 2, 4, 0, 0)
>>> parser.parse("02/04/2012")
datetime.datetime(2012, 2, 4, 0, 0)

所以,而不是

for row in csv_input:
    for date_format in ['%B %d, %Y']:
        try:
            converted = datetime.strptime(row[3], date_format)
            csv_output.writerow([row[0], row[1], row[2], converted.strftime(date_format), row[4]])
        except ValueError:
            pass

for row in csv_input:
    converted = parser.parse(row[3])
    csv_output.writerow([row[0], row[1], row[2], converted.strftime('%B %d, %Y'), row[4]])

这会将您输入的 所有 日期转换为标准格式,例如 "May 1, 2001"。我省略了你的 try...except 因为那是为了捕捉 strptime() 失败的情况,并且 parser.parse() 会做你通过的任何事情,只要它不是完全是废话,在那种情况下你不应该默默地抑制异常。

dateutil 不在标准库中,但值得安装。