CSV日期列仅含月日,Python转datetime时年份默认1900问题求助
我的CSV文件中日期列仅包含月日格式(如02-March),但在Excel中筛选该列时每条记录都显示有年份;用Python的csv模块读取文件时,日期仍保持月日格式:
acw_user_data = "data.csv" with open(acw_user_data, 'r') as csvfile: data = csv.reader(csvfile, delimiter = ',') line_count = 0 for row in data: if line_count == 0: print("FIELD_NAME_ARE: %s" % (row)) line_count += 1 else: print("THE_ROW_VALUES_ARE: %s" % (row)) line_count += 1
读取结果示例:THE_ROW_VALUES_ARE: ['00 Wheeler wells', 'Chapmanton', 'L2 7BT', '46', '13.72', 'Begum-Williams', '12-Aug', '26-Nov', '4.52944E+15', '583', '1', 'Jonathan', 'GB37UMCO54540228728019', 'Thomas', 'married or civil partner', '0', 'FALSE', '54016', 'Male', 'Nissan', 'ATS', '1996', 'Coupe']
我尝试将日期转换为datetime类型:
expiry_date = [d.get("Credit Card Expiry Date") for d in Credit_Card_info] for item in expiry_date: try: item = item.replace("/", "-") expiry_date = datetime.datetime.strptime(item,'%d-%b').date() print(expiry_date) except ValueError: print("ValueError in: ") print(item)
转换结果却自动补了1900年:1900-11-27 1900-11-26 1900-07-27 1900-04-18 1900-11-27 1900-05-15 1900-03-29 1900-04-27 1900-08-20 1900-10-13 1900-03-29
实际年份并未被识别,反而被替换成1900,该怎么解决?
原因
strptime解析仅含月日的日期时,默认会补全1900年作为缺失的年份,这是Python datetime模块的默认行为。而Excel里显示的年份是它自动补的,CSV文件本身并没有存储年份信息。
处理方案
根据需求不同,有两种常用处理方式:
1. 补全合理年份(如信用卡到期场景)
如果是信用卡到期日这类场景,通常需要取当前年份或下一年(若当前月已超过到期月),示例代码:
import datetime expiry_date_list = [d.get("Credit Card Expiry Date") for d in Credit_Card_info] current_year = datetime.datetime.now().year for item in expiry_date_list: try: item = item.replace("/", "-") # 先解析出月日信息 temp_date = datetime.datetime.strptime(item, '%d-%b') # 计算合理年份:当前月大于到期月则取明年,否则取今年 expiry_year = current_year + 1 if datetime.datetime.now().month > temp_date.month else current_year # 组合成完整日期 expiry_date = datetime.date(expiry_year, temp_date.month, temp_date.day) print(expiry_date) except ValueError as e: print(f"解析出错: {item}, 错误信息: {e}")
2. 仅保留月日信息(无需年份)
如果不需要年份,只是想统一处理月日,可以提取月日元组直接使用,示例代码:
import datetime expiry_date_list = [d.get("Credit Card Expiry Date") for d in Credit_Card_info] for item in expiry_date_list: try: item = item.replace("/", "-") # 解析出月日 parsed = datetime.datetime.strptime(item, '%d-%b') month_day = (parsed.month, parsed.day) # 可用于和当前日期的月日对比 today_month_day = (datetime.datetime.now().month, datetime.datetime.now().day) if month_day < today_month_day: print(f"{item} 已过期") else: print(f"{item} 未过期") except ValueError as e: print(f"解析出错: {item}, 错误信息: {e}")
Excel显示年份的说明
CSV是纯文本格式,本身不存储年份。Excel打开时会自动给仅含月日的日期补1900年,这是Excel的默认行为。若想让Excel正确显示,要么在CSV中补全年份,要么在Excel里将单元格格式设置为「月-日」。
内容的提问来源于stack exchange,提问作者Ray

