1. 方法
datetime.strptime() 是 Python 中的一个方法,用于将字符串解析为 datetime 对象,它的语法如下:
datetime.strptime(date_string, format)
其中:
date_string 是要解析的日期时间字符串。
format 是日期时间字符串的格式说明,例如 %Y-%m-%d %H:%M:%S 表示年-月-日 时:分:秒。
这个方法会返回一个 datetime 对象,表示解析后的日期时间。如果解析失败,则会抛出 ValueError 异常。
不妨“拿来主义”用这个方法来校验日期或时间的格式是否正确,省去了写长长的正则表达式。
2.举例:dateformat.py 校验日期+时间格式
from datetime import datetime
def validate_date(date_string, date_format):
try:
datetime.strptime(date_string, date_format)
return True
except ValueError:
return False
date_string = "2024-5-15"
date_format = "%Y-%m-%d"
if validate_date(date_string, date_format):
print("Valid date format")
else:
print("Invalid date format")
3.应用
现在有一个上万行的CSV文件,第一列是日期,格式 %Y-%m-%d;第二列是日期+时间,格式%Y-%m-%d %H:%M:%S,可以用上述方法实现对这两列的校验(36~40行)。
import csv
from datetime import datetime
def validate_datetime(datetime_string, datetime_format):
try:
datetime.strptime(datetime_string, datetime_format)
return True
except ValueError:
return False
def validate_date(date_string, date_format):
try:
datetime.strptime(date_string, date_format)
return True
except ValueError:
return False
datetime_format = "%Y-%m-%d %H:%M:%S"
date_format = "%Y-%m-%d"
def check_format(csv_file, output_file):
with open(csv_file, 'rb') as csvfile, open(output_file, 'w') as outfile:
reader = csv.reader(csvfile, delimiter='\t')
next(reader) # Skip the header row
for row_num, row in enumerate(reader, start=2): # Start from the second row
# Strip whitespace from each field
stripped_row = [field.strip() for field in row]
error_messages = [] # List to store error messages
if len(stripped_row) != 8:
error_messages.append("Error in row {}: Incorrect number of fields".format(row_num))
else:
if not validate_date(stripped_row[0], date_format):
error_messages.append("Error in row {}: Incorrect date format: {}".format(row_num,stripped_row[0]))
if not validate_date(stripped_row[1], datetime_format):
error_messages.append("Error in row {}: Incorrect datetime format: {}".format(row_num,stripped_row[1]))
if error_messages:
for error_message in error_messages:
outfile.write(error_message + '\n')
#else:
#outfile.write("Correct\n")
# csv_file_path is the file to check
csv_file_path = '/var/tmp/CpuMemory_202405141800.tsv'
output_file_path = './output_errors.txt'
check_format(csv_file_path, output_file_path)
可以校验出时间格式有误的行
# grep 'Incorrect date' output_errors.txt | head -10
Error in row 12966: Incorrect date format: 2024-02024-05-14
Error in row 19243: Incorrect datetime format: 2024-05-14 188:00:00
Error in row 20881: Incorrect date format: 024-05-14
Error in row 27704: Incorrect datetime format: 2024-05-14 18:0024-05-14 18:00:00
Error in row 28318: Incorrect datetime format: 2024-05-14 -14 18:00:00
Error in row 28932: Incorrect datetime format: 2024-05-14 18:00:8:00:00
Error in row 29478: Incorrect datetime format: 2024-05-14 18:05-14 18:00:00
Error in row 30706: Incorrect datetime format: 2000:00
Error in row 39645: Incorrect datetime format: 2024-05-14 10:00
Error in row 40805: Incorrect datetime format: 2024-05-14 18:00:00:00