Python中读取CSV文件并转换日期列为Datetime格式时的绘图问题
解决Datetime索引转换后绘图异常的问题
我来帮你搞定这个日期转换后绘图出问题的麻烦!从你描述的情况来看,核心问题大概率出在日期解析错误(比如1969被识别成2069)和Datetime索引的格式/频率不明确上,这两个点都会导致matplotlib绘图时的X轴渲染异常。下面针对你的两种方法分别给出修正方案,同时解决年份识别错误的问题:
先解决核心痛点:年份解析错误(1969→2069)
pd.to_datetime默认会把两位年份(比如"69")解析为2069而不是1969,所以必须明确指定日期格式,或者在导入时就用正确的参数处理日期。
修正方法1:导入时直接处理日期索引
你原来的方法是先设索引再转Datetime,这里改成导入时一步到位,同时指定日期格式避免年份错误:
import pandas as pd import matplotlib.pyplot as plt # 关键:导入时直接解析日期列并设为索引,指定匹配你数据的日期格式 # 比如你的date列是"YYYY-MM"格式就用'%Y-%m',是"MM/YYYY"就用'%m/%Y',根据实际情况调整 BP = pd.read_csv( '/Users/josedelgado/PycharmProjects/Fundamentals/Building_Permits.csv', index_col=0, parse_dates=[0], date_parser=lambda x: pd.to_datetime(x, format='%Y-%m') ) # 截取最近50年的数据(如果你的数据是按时间倒序排列的话,正序的话可以改成iloc[-12*50:]) BP = BP.iloc[:(12*50)] # 先检查日期是否正确解析(比如1969年应该显示为1969-xx-xx) print(BP.index) # 绘图 BP.plot() plt.ylabel('Permits') plt.title('New Building Permits - last 50 years') plt.show()
修正方法2:先处理日期再设索引
针对你第二种方法的问题,核心是要确保日期解析正确,并且设置索引后避免冗余列干扰:
import pandas as pd import matplotlib.pyplot as plt BP = pd.read_csv('/Users/josedelgado/PycharmProjects/Fundamentals/Building_Permits.csv') # 截取数据 BP = BP.iloc[:(12*50)] # 明确指定日期格式,解决年份识别错误 BP['Date'] = pd.to_datetime(BP['Date'], format='%Y-%m') # 替换成你的实际日期格式 # 设置索引后,删除原Date列避免混淆 BP.set_index('Date', inplace=True) BP.drop(columns=['Date'], errors='ignore', inplace=True) # 直接绘制Permits列,matplotlib会自动识别Datetime索引作为X轴 BP['Permits'].plot() plt.ylabel('Permits') plt.title('New Building Permits - last 50 years') plt.show()
额外排查点(如果还是有问题)
如果按照上面的方法还是绘图异常,可以检查这几个点:
- 检查Datetime索引的频率:如果你的数据是月度/季度数据,可以手动设置频率,比如
BP.index.freq = 'MS'(月度起始),这样matplotlib会正确渲染X轴刻度。 - 检查重复索引:用
print(BP.index.is_unique)验证,如果有重复日期,需要先聚合数据,比如BP = BP.groupby(BP.index).mean()。 - 检查缺失值:缺失的日期也会导致绘图断层,可以用
BP = BP.asfreq('MS')填充缺失值(根据数据频率调整)。
内容的提问来源于stack exchange,提问作者josed08
相关产品推荐
相关产品推荐

