关于 pandas 解析 json 文件和其他类型文件的结果中日期格式数据类型不一致的问题

博客讲述了在使用Pandas解析CSV和JSON文件时,遇到日期格式数据类型不一致的问题。解析JSON文件时,日期默认被转换为datetime64[ns]类型,而CSV和XML文件的日期保持为object类型。解决方案是通过设置`read_json`函数的`keep_default_dates`参数为False,阻止自动解析日期,确保所有文件解析结果统一。建议读者详细阅读文档以了解相关参数用法。
摘要由CSDN通过智能技术生成

问题:

我有两个文件,一个 .csv 文件和一个 .json 文件,数据截图分别如下:
在这里插入图片描述

在这里插入图片描述
我的目的是解析这些文件,并将结果统一交由下一个程序块进行处理。

在了解到 pandas 可以解析数据文件(csv、txt、json、xml、excel、html、fwf、spss等),于是选择 read_json 函数read_csv 函数分别解析 json 文件和 xml 文件。

但使用 pandas 的函数进行解析后,发现 json 文件和其他类型文件(例如 txt、csv、xml)中日期格式数据(例如 2020-02-01 )的解析结果类型不一致的问题:

import pandas as pd

def paras_file_json(filename):
    with open(filename, 'r') as f:
        df = pd.read_json(f)
        return df


def paras_file_csv(filename):
    with open(filename, 'r') as f:
        df = pd.read_csv(f)
        return df


def paras_file_xml(filename):
    with open(filename, 'r') as f:
        df = pd.read_xml(f)
        return df


df_json = paras_file_json('data.json')
df_csv = paras_file_csv('data.csv')
df_xml = paras_file_xml('data.xml')
print(df_json['date'].dtype)    # -> datetime64[ns]
print(df_csv['date'].dtype)     # -> object
print(df_xml['date'].dtype)     # -> object

在不涉及解析结果数据类型处理的操作中,这不会有什么问题,因为数据本身没有发生任何变化。
我需要根据解析结果的数据类型进行进一步的操作,如果不解决,实际上也只需要多加一层的类型判断。

原因分析:

一般来说,类似于 pandas 的这些数据处理库会保证数据解析结果的一致性,就可以排除是源码的不同实现结果造成的问题。

更多的情况应该是不同的设置导致的问题,于是仔细研读了 read_json 函数的参数列表,发现两个有意思的参数 convert_dateskeep_default_dates

根据该函数文档的说法,convert_dateskeep_default_dates 两者相互配合来决定是否以及解析哪些类似于日期数据的列。

默认情况下,二者均为 True,实际解析效果如下:

'2014-12-12' 解析为 '2014-12-12T00:00:00.000000000''05:41:45' 解析为 '2022-09-09T05:41:45.000000000''2008-05-1420:03:48' 解析为 '2008-05-14T20:03:48.000000000'

此时,这些解析结果的数据类型就为 datetime64[ns]

当我们解析时设置 keep_default_dates=False ,pandas 就不再主动解析这类数据,其解析结果的数据类型就和从其他文件中解析而来的结果一样都是 object 了。

解决:

关闭默认解析日期时间数据即可:

import pandas as pd

def paras_file_json(filename):
    with open(filename, 'r') as f:
        df = pd.read_json(f, keep_default_dates=False)
        return df

还请仔细阅读文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值