pd.to_datetime,try_except怎么才能处理出现多次的同一异常。

第一项:需求说明 

excel文件中,有一列格式为文本格式(object)的日期,需要转化为日期格式(datetime64[ns]),以便做后续处理。

 

 

第二项:遇到的问题

运行报错,原因是有3个单元格的值不规范:【0162-03-04】【0115-01-04】【0165-03-02】,没法转换为日期格式(datetime64[ns])。示例数据如下

 

import pandas as pd

path = r'C:\Users\Gavin\Desktop\数据范本 (1).xlsx'
df = pd.read_excel(path)
print(df)
print(df.dtypes)

df['日期'] = pd.to_datetime(df['日期'])

#  日期     时长
# 0   2021-01-21  0.912
# 1   0162-03-04  1.302
# 2   2021-02-11  0.116
# 3   2021-01-21  0.138
# 4   2021-02-11  0.127
# 5   0115-01-04  0.552
# 6   2021-02-15  0.125
# 7   2021-02-23  0.532
# 8   2021-02-25  0.528
# 9   0165-03-02  0.527
# 10  2021-03-05  0.128
# 日期     object
# 时长    float64
# dtype: object

# 报错:pandas._libs.tslibs.np_datetime.OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 162-03-04 00:00:00

 

 

第三项:不成熟的方案(只能解决一个异常数据)

如果日期列只有一个不规范的值,可以通过以下代码解决,将日期整列转化为日期格式。如下

 

import pandas as pd

path = r'C:\Users\Gavin\Desktop\数据范本.xlsx'
df = pd.read_excel(path)
print(df)
print(df.dtypes)

# 日期     时长
# 0  2021-01-21  0.912
# 1  0162-03-04  1.302
# 2  2021-02-11  0.116
# 3  2021-01-21  0.138
# 4  2021-02-11  0.127
# 日期     object
# 时长    float64
# dtype: object

try:
    df['日期'] = pd.to_datetime(df['日期'])
except Exception as e:
    err = str(e)
    err_value = '{}{}'.format(0, err[err.find(':') + 2:err.find(':') +
                                    11])  #获得报错的值
    right_value = '{}{}'.format(2021, err[err.find(':') + 5:err.find(':') +
                                        12])  #获得修正值
    err_value_index = df.loc[df['日期'] == err_value,
                            '日期'].index.values  #获得错值的index
    df.iloc[err_value_index, [0]] = right_value  #修改报错值
    df['日期'] = pd.to_datetime(df['日期'])

print(df)
print(df.dtypes)

#  日期     时长
# 0 2021-01-21  0.912
# 1 2021-03-04  1.302
# 2 2021-02-11  0.116
# 3 2021-01-21  0.138
# 4 2021-02-11  0.127
# 日期    datetime64[ns]
# 时长           float64
# dtype: object

 

 

请教:怎么将第一个代码块那样——日期列有多个不规范数据,仍能将整列转化为日期格式(datetime64[ns]),谢谢!

 

 

 

 

 

path = r'C:\Users\Gavin\Desktop\数据范本.xlsx'
df = pd.read_excel(path)
print(df)
print(df.dtypes)

for i,d in enumerate(df['日期']):
    if int(d[0:4]) < 1900:
        df['日期'][i] = "2021"+d[4:]
df['日期'] = pd.to_datetime(df['日期'])

print(df)
print(df.dtypes)

 

for i in range(len(df)):

    year=df['date'][i].split('-')[0]

    if  int(year)< 1900:

        df['date'][i]=df['date'][i].replace(year,'2021')

df['date']=pd.to_datetime(df['date'])    

print(df)