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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:02:37