pandas 在Python中,有没有什么方法可以在不强制的情况下解析/重新格式化列中的无效日期数据?

vmpqdwk3  于 2022-12-31  发布在  Python
关注(0)|答案(2)|浏览(112)

我有一个列中包含无效日期数据的数据集。它的格式为yyyymmdd,我需要将它们重新格式化为mm/dd/yyyy。我尝试强制该值,但它不满足条件,因为它是数据,即使无效也需要打印出来。
下面是csv格式的数据示例

数据的日期为“00”,我们都知道第0天是不存在的,因此在打印 Dataframe 时会产生错误。
我试着把errors='coerce换成errors='ignore,只是想看看它是否能通过条件,但它没有。
我想打印/重新格式化无效数据而不强制值。有什么办法吗?
下面是我的代码行:

df['charge_off_date'] = pd.to_datetime(hals2['charge_off_date'], format='%Y%m%d', errors='ignore')
df['charge_off_date'] = df['charge_off_date'].dt.strftime('%m/%d/%Y')
vxf3dgd4

vxf3dgd41#

如果它是无效的,你不能将它格式化为日期,你可以将它当作字符串,知道它是yyyymmdd,你可以在一个自定义函数中格式化一个字符串,并将它应用到你的列中。

def format_invalid_date(d: int)->str:
    d=str(d)
    return f"{d[:4]}/{d[4:6]}/{d[6:]}"

df['charge_off_date']=df['charge_off_date'].apply(format_invalid_date)

这应该将19000100转换为1900/01/00,作为日期仍然无效,但看起来像是日期格式。

vxf3dgd4

vxf3dgd42#

def format_invalid_date(date):
    year = int(str(date)[0:4])
    month = int(str(date)[4:6])
    day = int(str(date)[6:8])
    
    if day == 0:
        day = 1
        
    date = datetime.datetime(year, month, day).strftime("%m/%d/%Y")
    
    return date

   
df['charge_off_date'] = df['charge_off_date'].apply(format_invalid_date)

示例:

df = pd.DataFrame({'charge_off_date': [19000100, 19901120, 20131202]})

df['charge_off_date'] = df['charge_off_date'].apply(format_invalid_date)
print(df)

输出:

charge_off_date
0      01/01/1900
1      11/20/1990
2      12/02/2013

相关问题