我正在读取一个文本文件,其中一列(第三列)包含不同日期格式的日期值以及其他数据类型(字符串、数字等)。我正在识别输入文件中的每个唯一日期格式,并将每个日期格式的值输出到文本文件。我在输入文件中查找的日期格式之一是 - 月 dd,YYYY。
例如2001 年 5 月 1 日。
我正在使用 python strftime() 函数在我的文件中搜索上述日期格式。但是,我下面提供的代码仅输出带零填充的日期值。
例如2001 年 5 月 1 日
但是,我需要我的程序也能找到没有零填充的日期值,我知道输入文件中存在这种情况,例如:
2001 年 5 月 1 日
2012年2月4日
我在论坛中搜索了解决方案,其中大部分涉及删除/替换零。但是,这并不能解决我的问题,因为我正在文件中搜索零填充和非零填充日期值。
我还尝试在日期格式中的“%”符号后面添加“-”符号,但它不起作用。我在下面提供了我的代码。谁能引导我走向正确的方向?我使用 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
最佳答案
使用datetime.strptime()
可靠地完成您想要的操作非常非常困难。我可以从您的代码中看到您已经计划拥有多个日期格式字符串(否则您的日期格式字符串不会位于 1 列表中)。
尝试这种方法:
>>> 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]])
这会将您输入的所有日期转换为标准格式,例如“2001 年 5 月 1 日”。我省略了您的 try... except
因为它可以捕获 strptime()
失败和 parser.parse()
的情况> 会很好地完成你传递的任何内容,只要它不是完全无意义的,在这种情况下,你不应该想默默地抑制异常。
dateutil
不在标准库中,但非常值得安装。
关于python - 使用 python strftime() 识别文本文件中月份和日期没有零填充的日期值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48531163/