第一项:需求说明
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]),谢谢!