CSV日期列240行后格式不一致,如何统一为%Y-%m-%d格式?
日期格式统一处理方案
你的核心需求是将CSV中Date列的两种日期格式统一为%Y-%m-%d(如1880-01-15),其中第240行之后的日期是%d-%m-%y格式(如15-01-00)。以下是修正后的实现代码:
import pandas as pd # 直接读取原始CSV,无需重复保存再读取 df = pd.read_csv("sea_levels_1880_2015.csv") # 处理Date列中的逗号分隔(如果原数据存在该情况) df['Date'] = df['Date'].str.replace(',', '-') # 针对不同行的日期格式分别转换 # 前240行使用%Y-%m-%d格式,240行及以后使用%d-%m-%y格式 # 两位年份会自动根据数据范围推断世纪(如00对应2000,99对应1999) df.loc[:239, 'Date'] = pd.to_datetime(df.loc[:239, 'Date'], format='%Y-%m-%d') df.loc[240:, 'Date'] = pd.to_datetime(df.loc[240:, 'Date'], format='%d-%m-%y') # 将datetime类型统一格式化为%Y-%m-%d的字符串(若需保留datetime类型可跳过此步) df['Date'] = df['Date'].dt.strftime('%Y-%m-%d') # 保存处理后的文件 df.to_csv("sea_lvl_1880_2015_updated.csv", index=False) # 查看处理结果 print(df)
关键修正说明
- 移除了不必要的重复保存/读取操作,直接在原始DataFrame上处理,提升效率。
- 使用
df.loc精准定位不同格式的行,指定对应格式进行转换,避免格式不匹配报错。 - 自动处理两位年份的世纪推断,适配数据的时间范围(1880-2015)。
灵活适配版本(无需固定行号)
如果不确定格式切换的具体行号,可以通过字符串特征自动判断格式,代码如下:
import pandas as pd df = pd.read_csv("sea_levels_1880_2015.csv") df['Date'] = df['Date'].str.replace(',', '-') # 自动识别格式:以4位数字开头的用%Y-%m-%d,否则用%d-%m-%y mask = df['Date'].str.match(r'^\d{4}-') df.loc[mask, 'Date'] = pd.to_datetime(df.loc[mask, 'Date'], format='%Y-%m-%d') df.loc[~mask, 'Date'] = pd.to_datetime(df.loc[~mask, 'Date'], format='%d-%m-%y') df['Date'] = df['Date'].dt.strftime('%Y-%m-%d') df.to_csv("sea_lvl_1880_2015_updated.csv", index=False)
内容的提问来源于stack exchange,提问作者adubis
相关产品推荐
相关产品推荐

