排序不同格式的日期Python



我很难对不同格式的日期进行排序。我有一个系列的输入包含许多不同格式的日期,需要提取它们并按时间顺序排序。到目前为止,我已经为完全数字日期(01/01/1989),带月日期(1989年3月12日或1989年3月12日或1989年3月12日)和仅给出年份的日期设置了不同的正则表达式(见下面的代码)

pat1=r'(d{0,2}[/-]d{0,2}[/-]d{2,4})' # matches mm/dd/yy and mm/dd/yyyy
pat2=r'((d{1,2})?W?(Jan|Feb|Mar|Apr|May|June|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*W+(d{1,2})?W?d{4})' 
pat3=r'((?<!d)(d{4})(?!d))'
finalpat=pat1 + "|"+ pat2 + "|"  + pat3
df2=df1.str.extractall(finalpat).groupby(level=0).first()

我现在得到了一个数据框,上面的不同列中有不同的正则表达式,我需要在可用时间内进行转换。

我的问题是,我得到的日期像Mar 12 198912 Mar 1989Mar 1989(无日)在我的数据框架的同一列。没有两种格式(月dd YYYY和月dd YYYY),我可以很容易地做到这一点:

df3=df2.copy()
dico={"Jan":'01','Feb':'02','Mar':'03','Apr':'04','May':'05','Jun':'06','Jul':'07','Aug':'08','Sep':'09','Oct':'10','Nov':'11','Dec':'12'}

df3[1]=df3[1].str.replace("(?<=[A-Z]{1}[a-z]{2})w*","")  # we replace the month in the column by its number, and remove
for key,item in dico.items():                          # the letters in month after the first 3.
df3[1]=df3[1].str.replace(key,item)
df3[1]=df3[1].str.replace("^(d{1,2}/d{4})",r'01/g<1>')
df3[1]=pd.to_datetime(df3[1],format='%d/%m/%Y').dt.strftime('%Y%m%d')  # add 01 if no day given

,其中df3[1]是感兴趣的列。我用字典把月份改成他们的号码,然后得到我想要的日期。问题是,对于日期的两种格式(1989年3月12日和1989年3月12日),其中一种格式将被错误地转换。

是否有办法区分日期格式并相应地应用不同的转换?

Thanks a lot

问题是我得到了1989年3月12日和1989年3月12日这样的日期和1989年3月(无日)在我的数据框的同一列。

pandas.to_datetime可以处理这个问题,考虑以下示例

import pandas as pd
df = pd.DataFrame({'d_str':["Mar 12 1989", "12 Mar 1989", "Mar 1989"]})
df['d_dt'] = pd.to_datetime(df.d_str)
print(df)

输出
d_str       d_dt
0  Mar 12 1989 1989-03-12
1  12 Mar 1989 1989-03-12
2     Mar 1989 1989-03-01

现在您可以使用d_dt进行排序,因为它具有datetime64[ns]类型,但您必须记住,缺少day被视为给定月份的第一天。请注意,如果您的数据包含中端格式(mm/dd/yy)的日期,则可能会失败。

最新更新