排序字符串 'Apr-01','Feb-02'... 在一月到十二月排序 顺序:Pandas

Posted

技术标签:

【中文标题】排序字符串 \'Apr-01\',\'Feb-02\'... 在一月到十二月排序 顺序:Pandas【英文标题】:sort strings of 'Apr-01',' Feb-02'... sort in January to December Order: Pandas排序字符串 'Apr-01','Feb-02'... 在一月到十二月排序 顺序:Pandas 【发布时间】:2021-12-01 19:42:48 【问题描述】:

一如既往,我们非常感谢大家的帮助 我有一个熊猫列,其中包含来自 datetime obj 的字符串。需要在一月 - 十二月的顺序(一月,二月,三月...十二月)对它们进行排序。我试图将该列转换为日期时间,但看起来像 Apr-01 没有年份参考不会转换(或者我无法弄清楚)

df = pd.DataFrame(['Apr-01','Apr-02','Apr-03','Aug-01','Aug-02',
      'Aug-03','Dec-07','Dec-08','Dec-09','Jul-01','Jul-02','Jul-03'])

【问题讨论】:

【参考方案1】:

您可以添加默认年份,例如

import pandas as pd

df = pd.DataFrame('dates':['Apr-01','Apr-02','Apr-03','Aug-01','Aug-02',
      'Aug-03','Dec-07','Dec-08','Dec-09','Jul-01','Jul-02','Jul-03'])

# use 2020 as default year in case dates originate from leap year...
df['dates_y'] = pd.to_datetime(df['dates']+' 2020')

df.sort_values(by=['dates_y'])
Out[2]: 
     dates    dates_y
0   Apr-01 2020-04-01
1   Apr-02 2020-04-02
2   Apr-03 2020-04-03
9   Jul-01 2020-07-01
10  Jul-02 2020-07-02
11  Jul-03 2020-07-03
3   Aug-01 2020-08-01
4   Aug-02 2020-08-02
5   Aug-03 2020-08-03
6   Dec-07 2020-12-07
7   Dec-08 2020-12-08
8   Dec-09 2020-12-09

清理后,您将设置一个key 进行排序,使用与默认年份创建日期时间相同的原则:

df.sort_values(by=['dates'], key=lambda t: pd.to_datetime(t+' 2020'))
Out[3]: 
     dates
0   Apr-01
1   Apr-02
2   Apr-03
9   Jul-01
10  Jul-02
11  Jul-03
3   Aug-01
4   Aug-02
5   Aug-03
6   Dec-07
7   Dec-08
8   Dec-09

【讨论】:

'cleaner' 版本要好得多,因为它节省了几行代码和创建新列的中间步骤。一行,非常优雅,非常感谢 @data_runner 第一个选项很好地说明了原理,尽管我在实践中也会使用第二个。 同意!如果没有第一选择,就很难掌握这个概念。我什至首先天真地尝试将 2021 年作为虚拟年,但显然它抛出了错误,因为 2021 年 12 月 18 日还不存在(截至今天,2021 年 10 月 17 日)

以上是关于排序字符串 'Apr-01','Feb-02'... 在一月到十二月排序 顺序:Pandas的主要内容,如果未能解决你的问题,请参考以下文章

使用表达式的一部分进行分组

如何在python中将'Sat Feb 02 12:50:00 IST 2019'转换为常规日期时间?

将excel VBA中的日期类型(Sun Apr 01 00:00:00 UTC 2018)转换为自定义函数

SQLSERVER字符串排序

python中进行字符串排序

SQL 字符串按大小排序