You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 01:12:41