pandas pd.to_datetime将混合对象要素列值转换为NAT值,但打算提取月份

neskvpey  于 2023-06-28  发布在  其他
关注(0)|答案(2)|浏览(128)

我一直在尝试使用pd.to_datetime处理Dataframe中的日期列,以获取int类型的月份。
这是使用pandas的Python代码。

print(df["date"].head())
0       Oct
1       Jun
2    15-Oct
3    27-Nov
4    26-Sep
Name: date, dtype: object

在尝试转换为datetime之后,我获得了NAT中的所有值。我该怎么解决?

df["date"]=pd.to_datetime(df["date"],errors='coerce')
print(df["date"].head())

我得到:

0   NaT
1   NaT
2   NaT
3   NaT
4   NaT

Name: date, dtype: datetime64[ns]

运行isNA将返回NAT处的所有值:

print(df["date"].isna().sum())
1000

我计划获得:

0       10
1       06
2       10
3       11
4       09

对于不能转换为datetime和int的值(因为值丢失或无法识别),我计划替换为“未给出日期”
我需要做什么?

ecbunoof

ecbunoof1#

Series.str.extractSeries.map一起使用:

d = {'Jan':'01', 'Feb':'02','Mar':'03', 'Apr':'04', 
     'May':'05','Jun':'06', 'Jul':'07','Aug':'08',
     'Sep':'09', 'Oct':'10', 'Nov':'11', 'Dec':'12'}

df["date1"] = df["date"].str.extract(r'([A-Za-z]+)', expand=False).map(d)

或者使用%b将值转换为日期时间,以匹配月份,并使用Series.dt.strftime转换为字符串:

df["date2"] = pd.to_datetime(df["date"].str.extract(r'([A-Za-z]+)', expand=False), 
                             format='%b', errors='coerce').dt.strftime('%m')
print (df)
     date date1 date2
0     Oct    10    10
1     Jun    06    06
2  15-Oct    10    10
3  27-Nov    11    11
4  26-Sep    09    09

如果需要整数:

print (df)
     date
0    Ocyt
1     Jun
2  15-Oct
3  27-Nov
4  26-Sep

df["date2"] = (pd.to_datetime(df["date"].str.extract(r'([A-Za-z]+)', expand=False), 
                              format='%b', errors='coerce')
                 .dt.month.astype('Int64'))
print (df)
     date  date2
0    Ocyt   <NA>
1     Jun      6
2  15-Oct     10
3  27-Nov     11
4  26-Sep      9
nnt7mjpx

nnt7mjpx2#

您可以在'-'上拆分列,并保留最后一部分:

>>> pd.to_datetime(df['date'].str.split('-').str[-1], format='%b', errors='coerce').dt.month
0    10
1     6
2    10
3    11
4     9
Name: date, dtype: int32

如果您的区域设置不是英语,您可以用途:

import locale

locale.setlocale(locale.LC_TIME, 'C')

相关问题