已知日期属同一月份,如何用Pandas对混合格式日期列升序排序?
混合格式日期列升序排序方案
已知某列日期字符串均属于单个月份,其中部分格式为mm/dd/yy(月/日/年),部分为dd/mm/yy(日/月/年),需将该列按日期升序排序。
示例1
data = { 'date': ['1/1/2020','20/1/2020', '1/1/2020', '1/28/2020','21/1/2020', '1/25/2020', '29/1/2020'], } df = pd.DataFrame(data) print(df)
补充示例
import pandas as pd data = {'Tgl': { 1: '1/1/2023', 2: '1/1/2023', 3: '1/3/2023', 4: '1/5/2023', 5: '1/5/2023', 6: '1/9/2023', 7: '10/1/2023', 8: '12/1/2023', 9: '16/1/2023'}} df = pd.DataFrame(data)
解决方法
方法1:指定目标月份解析
利用已知的统一月份,对每个日期字符串尝试两种格式解析,保留月份匹配的结果:
import pandas as pd def parse_mixed_dates(date_str, target_month): # 尝试月/日/年格式 parse_mdy = pd.to_datetime(date_str, format='%m/%d/%Y', errors='coerce') # 尝试日/月/年格式 parse_dmy = pd.to_datetime(date_str, format='%d/%m/%Y', errors='coerce') # 返回与目标月份匹配的解析结果 if not pd.isna(parse_mdy) and parse_mdy.month == target_month: return parse_mdy elif not pd.isna(parse_dmy) and parse_dmy.month == target_month: return parse_dmy return pd.NaT # 异常日期返回空值,可按需调整 # 示例1应用:目标月份为1月 df['parsed_date'] = df['date'].apply(lambda x: parse_mixed_dates(x, target_month=1)) df_sorted = df.sort_values('parsed_date') # 补充示例应用:目标月份为1月 df['parsed_date'] = df['Tgl'].apply(lambda x: parse_mixed_dates(x, target_month=1)) df_sorted = df.sort_values('parsed_date')
方法2:自动识别目标月份
若未明确目标月份,可通过统计有效解析结果的月份,自动确定统一月份后完成解析:
import pandas as pd # 生成两种格式的解析列 df['date_mdy'] = pd.to_datetime(df['date'], format='%m/%d/%Y', errors='coerce') df['date_dmy'] = pd.to_datetime(df['date'], format='%d/%m/%Y', errors='coerce') # 统计所有有效解析结果的月份,取出现次数最多的作为目标月份 all_valid_months = pd.concat([df['date_mdy'].dropna().dt.month, df['date_dmy'].dropna().dt.month]) target_month = all_valid_months.mode()[0] # 合并正确的解析结果 df['parsed_date'] = df.apply( lambda row: row['date_mdy'] if not pd.isna(row['date_mdy']) and row['date_mdy'].month == target_month else row['date_dmy'], axis=1 ) # 排序并清理临时列 df_sorted = df.sort_values('parsed_date').drop(columns=['date_mdy', 'date_dmy'])
结果验证
以补充示例为例,解析排序后,10/1/2023(对应1月10日)会排在1/9/2023(对应1月9日)之后,符合日期升序逻辑。
内容的提问来源于stack exchange,提问作者meg hidey
相关产品推荐
相关产品推荐

