使用 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 告诉我这件事。
非常很难使用 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
不在标准库中,但值得安装。
我正在阅读一个文本文件,其中一列(第 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 告诉我这件事。
非常很难使用 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
不在标准库中,但值得安装。