按存储为字符串的日期列对数据框进行排序

数据挖掘 Python 时间序列 熊猫 数据框
2022-02-18 13:15:16

我有名为df1.

我想根据月份(Jan、Feb、March ..)对数据框月份列进行排序。

为此,我使用了代码:

sorted_df = df1.sort_values(by='month')
print(sorted_df)

但输出按月份列的字母顺序排序。

我认为本月列数据类型的原因是对象,因此月列按字母顺序排序。

问题是:如何以正确的顺序对月份列中的值进行排序(根据一年中的月份顺序)?

我的数据框:

拼音

2个回答

您的month列实际上是部分日期(即缺少年份),但您仍然可以将该列转换为适当的日期格式,然后进行排序。您必须指定一种格式,以便解析器大致知道要做什么。

df["date"] = pd.to_datetime(["20-Apr"], format="%d-%b")
df.sort_values("date")   # ascending by default

如果没有任何年份信息,它将添加年份为 1900。


如果您想添加例如今年,您可以执行以下操作,将12*20月份添加到新日期列:

df["fixed_date"] = df.date.apply(lambda x: pd.tseries.offsets.shift_month(x, 12*20))

我建议首先将月份列分成daymonth使用str.split('-')

# create test data
df = pd.DataFrame(['20-Apr', '19-Mar', '4-Dec'], columns=['month'])
# create day column
df['day'] = 0 
split =  df['month'].str.split('-', expand=True)
df['day'], df['month'] = split[0], split[1]

现在那个月份是分开的,您可以将其更改为分类,以便可以自定义排序

df['month'] = pd.Categorical(df['month'], ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])

现在你可以排序

df.sort_values("month")

希望这可以帮助