【问题标题】:Sort df by date column by month按日期按月对df进行排序
【发布时间】:2025-11-29 18:45:01
【问题描述】:

我有一个日期格式如下的 df:yyyy-mm-dd

我导入了数据并使用 parse-dates 将其作为日期时间对象读入:

df1 = pd.read_csv(file1, encoding="utf-8", sep=',', parse_dates=['Date'])

我想找到最高和最低温度并绘制它们。

我很接近。

我正在让基本绘图(现在只是最大和最小线)工作如下:

df1["str_dates"] = df1["Date"].astype({'Date': 'str'})
str_dates_temp = df1.groupby("Date")["str_dates"].unique().to_list()
str_dates = [''.join(x) for x in str_dates_temp]
df1 = df1.sort_values(by="Date", ascending=True)
print(df1.head(), '\n')
print(df1.tail(), '\n')
grouped_max_list = df1.groupby("Date")["Data_Value"].max().to_list()
grouped_min_list = df1.groupby("Date")["Data_Value"].min().to_list()

fig, axe = plt.subplots(figsize=(16, 8), facecolor='1.0')
axe.set_facecolor("1.0")
plt.plot(str_dates, grouped_max_list, color='blue')
plt.plot(str_dates, grouped_min_list, color='salmon')
plt.show()

问题是 df 按日期排序。这意味着数据按年、月、日从左到右显示。

所以我得到 2005 年 1 月、2005 年 2 月、2005 年 3 月 ... 2005 年 12 月、2006 年 1 月、2006 年 2 月、2006 年 3 月 ... 2006 年 12 月,等等。

我希望将所有月份分组以用于绘图。

所以我希望 df 排序如下: 2005 年 1 月、2006 年 1 月、2007 年 1 月、... 2014 年 1 月、2005 年 2 月、2006 年 2 月、2007 年 2 月、... 2014 年 2 月,依此类推。

通过我的日期排序,我的情节如下所示:

如果数据按月份分组,则\应该如下所示:

我不确定如何调整排序以达到预期的结果。

我想要的只是排序方面的帮助。没有别的了。

【问题讨论】:

  • 您正在使用str_dates 进行绘图。这意味着 matplotlib 只能将它们解释为单词,并试图按字典顺序对它们进行排序。您应该以日期时间格式传递它们
  • @Henry Ecker,我按日期时间列(“日期”)排序。我想使用该列调整排序,以按月进行分组\排序。我的排序需要“增强”。
  • 是的,我明白了。我只是澄清 matplotlib 自己进行排序以定位其轴。无论您在 DataFrame 中的数据顺序如何,轴最终都会由您的图形库决定。

标签: python-3.x pandas sorting datetime


【解决方案1】:
df = df.groupby(df['Date'].dt.strftime('%Y-%m')).max()
df["Month"] = pd.to_datetime(df.Date, format='%b', errors='coerce').dt.month
df = df.sort_values(by="Month").drop(['Month'], axis=1)

代码结果示例:

  • 开始 df:

  • 结果 df:

【讨论】:

  • 我的 df 中的日期现在按月而不是按年排序。
  • 我在你的食谱后面添加了一个“年”列,并按“月”和“年”排序,它有效。
最近更新 更多