如何从datetime中移除年份,实现多年数据按月叠加绘制?
解决方法:移除年份并叠加绘制多年份月份数据
看起来你想要把10年数据中同月同日同时的FH值放在一起对比绘图,核心是要把时间轴统一成“无年份”的格式,同时保留年份作为区分不同曲线的依据。你的代码里尝试直接相加年份、月份等数值,这会得到整数而非时间格式,我们可以用两种更简便的方式解决:
方法1:生成统一年份的Datetime(推荐)
把所有数据的年份替换成同一个固定年份(比如选闰年2020,避免2月29日的问题),这样既保留了datetime的时间属性,又能让不同年份的同月同日同时数据对齐,绘图时x轴可以直接用时间格式展示。
修正后的完整代码:
import pandas as pd import matplotlib.pyplot as plt # 读取并预处理数据 df_data = pd.read_csv("P11-B2.csv", skiprows=range(1,35), usecols=[1,2,4]) df = pd.DataFrame() # 生成完整的Datetime列 df['Datetime'] = pd.to_datetime(df_data['YYYYMMDD'], format='%Y%m%d') + pd.to_timedelta(df_data[' HH'], unit='h') df['FH'] = pd.to_numeric(df_data[' FH'], errors='coerce') # 提取年份用于分组绘图 df['year'] = df['Datetime'].dt.year # 生成无年份的Datetime:将所有年份替换为2020(闰年,覆盖所有日期) df['Datetime_no_year'] = df['Datetime'].apply(lambda x: x.replace(year=2020)) # 按年份分组绘图 fig, ax = plt.subplots(figsize=(12, 6)) for year, group in df.groupby('year'): ax.plot(group['Datetime_no_year'], group['FH'], label=str(year)) # 设置x轴显示为「月-日 时」格式 ax.xaxis.set_major_formatter(plt.matplotlib.dates.DateFormatter('%m-%d %H')) plt.xticks(rotation=45) # 旋转标签避免重叠 plt.legend(title='Year') plt.ylabel('FH') plt.xlabel('Month-Day Hour') plt.tight_layout() plt.show()
方法2:用“年积时”数值作为X轴
如果更倾向于用整数作为x轴,可以计算每个时间点在一年中的累计小时数(1月1日0时为0,12月31日23时为8783或8759),这样不同年份的同一天同一小时会对应相同的整数值。
代码示例:
# 生成年积时:一年中的第N个小时 df['hour_of_year'] = df['Datetime'].dt.dayofyear * 24 + df['Datetime'].dt.hour # 绘图 fig, ax = plt.subplots(figsize=(12, 6)) for year, group in df.groupby('year'): ax.plot(group['hour_of_year'], group['FH'], label=str(year)) # 手动设置x轴标签为月份 ax.set_xticks([i * 24 * 30 for i in range(13)]) ax.set_xticklabels(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Jan']) plt.legend(title='Year') plt.ylabel('FH') plt.xlabel('Month') plt.tight_layout() plt.show()
为什么你的原代码会得到整数?
你之前用df['DATE'] = df['year'] + df['month'] + df['day'] + df['hour']是数值相加,比如1900+1+1+0=1902,这并不是时间拼接。如果想用字符串格式的%m%d%H,可以用df['m_d_h'] = df['Datetime'].dt.strftime('%m%d%H'),但字符串类型在绘图时的排序和格式控制不如datetime或数值方便,所以不推荐。
内容的提问来源于stack exchange,提问作者bertus
相关产品推荐
相关产品推荐

