Gavin_Stargazer 2021-03-04 15:07 采纳率: 62.5%
浏览 130
已结题

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]),谢谢!

 

 

 

 

 

  • 写回答

2条回答 默认 最新

  • 天际的海浪 2021-03-04 15:44
    关注
    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)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月11日

悬赏问题

  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)