如何从CSV的Pandas Datetime列提取年月并修正日期转换错误?
解决Pandas日期转换颠倒问题并提取年月
首先,咱们先搞定日期解析错误的核心问题——你遇到的是因为pd.to_datetime()默认会把日期字符串里的第一个数字当成月份,但你的数据实际是日/月/年格式(比如2/1/2018是1月2日,不是2月1日),而且你之前写的格式%d/%M/%Y也有小错误:大写M代表分钟,月份应该用小写m。下面给你两种靠谱的修复方法:
方法1:指定format参数(推荐)
直接告诉Pandas你的日期格式是%d/%m/%Y,这样解析既精准又高效,适合格式统一的数据集:
import pandas as pd # 读取CSV后转换日期列 df['OrderDate'] = pd.to_datetime(df['OrderDate'], format='%d/%m/%Y')
方法2:用dayfirst=True参数
如果你的数据偶尔存在混合格式,但大部分是日在前的情况,可以用这个参数让Pandas优先把第一个数字当作日期:
df['OrderDate'] = pd.to_datetime(df['OrderDate'], dayfirst=True)
不过这个方法不如指定format精准,容易在混合格式下出问题,所以优先选第一种。
接下来是提取月份和年份,给你三种常用方式,按需选择:
方式1:提取为时期对象(适合后续时间分析)
如果需要保留时间序列的特性,用dt.to_period('M')会得到类似2018-01的时期对象,方便后续按年月分组统计:
df['YearMonth'] = df['OrderDate'].dt.to_period('M')
方式2:提取为字符串格式(适合导出或展示)
如果要得到2018-01或者Jan-2018这类可读性强的字符串,用dt.strftime():
# 年-月格式 df['YearMonth'] = df['OrderDate'].dt.strftime('%Y-%m') # 月份缩写-年份格式 df['YearMonth'] = df['OrderDate'].dt.strftime('%b-%Y')
方式3:分别提取年和月为单独列
如果需要把年、月拆成两个独立列:
df['Year'] = df['OrderDate'].dt.year df['Month'] = df['OrderDate'].dt.month
举个完整的实操例子,假设你的CSV数据如下:
OrderDate,Amount
2/1/2018,100
3/1/2018,200
15/2/2018,150
运行代码:
import pandas as pd df = pd.read_csv('your_file.csv') # 正确转换日期 df['OrderDate'] = pd.to_datetime(df['OrderDate'], format='%d/%m/%Y') # 提取年月字符串 df['YearMonth'] = df['OrderDate'].dt.strftime('%Y-%m') print(df)
输出结果:
OrderDate Amount YearMonth 0 2018-01-02 100 2018-01 1 2018-01-03 200 2018-01 2 2018-02-15 150 2018-02
这样就完美解决了日期颠倒的问题,同时得到了你需要的年月信息~
内容的提问来源于stack exchange,提问作者Shavin Dhavindar
相关产品推荐
相关产品推荐

