解决Pandas中月份为名称格式的datetime列排序异常问题
解决Pandas日期字符串排序错误的问题
嘿,这个问题我之前也踩过坑!你遇到的排序错误,核心原因是:当你用dt.strftime('%d-%b-%Y')把datetime对象转换成字符串后,Pandas的排序就会按照字符串的字符ASCII顺序来处理,而不是实际的日期逻辑。比如"14-Jan-2019"的第一个字符是'1',比"04-Feb-2019"的'0'ASCII值大,所以字符串排序会把1月14日排在2月4日后面,但实际1月14日早于2月4日,这就导致了错误的顺序。
下面给你两种靠谱的解决方法:
方法一:用Datetime类型列排序(推荐)
最稳妥的方式是保留datetime类型的列来做排序,字符串格式只用来最终展示,步骤如下:
- 先把
Date Time列转换为datetime类型,存到一个临时列里 - 用这个datetime列做排序(这时候会严格按照日期逻辑排序)
- 最后再生成你需要的
%d-%b-%Y格式的字符串日期列
代码示例:
# 1. 将原始字符串日期转为datetime类型,保留临时列 df['datetime_col'] = pd.to_datetime(df['Date Time']) # 2. 用datetime列进行升序排序 df.sort_values(by='datetime_col', inplace=True, ascending=True) # 3. 生成目标格式的日期字符串列 df['Date'] = df['datetime_col'].dt.strftime('%d-%b-%Y') # 如果不需要临时列,可以最后删除 # df.drop('datetime_col', axis=1, inplace=True)
方法二:用可排序的日期字符串格式
如果你一定要用字符串列来排序,可以先把日期转成%Y-%m-%d(年-月-日)的格式,这种格式的字符串排序顺序和实际日期顺序完全一致,排序完成后再转成你需要的格式:
代码示例:
# 生成用于排序的年-月-日格式字符串 df['sort_date'] = pd.to_datetime(df['Date Time']).dt.strftime('%Y-%m-%d') # 按这个字符串列排序 df.sort_values(by='sort_date', inplace=True, ascending=True) # 转成目标日期格式 df['Date'] = pd.to_datetime(df['sort_date']).dt.strftime('%d-%b-%Y') # 删除临时排序列 df.drop('sort_date', axis=1, inplace=True)
更简洁的写法
如果你不想生成临时列,也可以直接在sort_values里用转换后的datetime对象:
# 直接用pd.to_datetime的结果作为排序依据 df.sort_values(by=pd.to_datetime(df['Date Time']), inplace=True, ascending=True) # 再生成目标格式的Date列 df['Date'] = pd.to_datetime(df['Date Time']).dt.strftime('%d-%b-%Y')
总的来说,处理日期相关的排序、筛选等操作时,尽量保留datetime类型,字符串格式只用于最终的展示输出,这样就能避免这类排序错误啦!
内容的提问来源于stack exchange,提问作者harry04
相关产品推荐
相关产品推荐

