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


    问题:

    我有两个文件,一个 .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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

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

    原因分析:

    一般来说,类似于 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'
    
    • 1
    • 2
    • 3

    此时,这些解析结果的数据类型就为 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    还请仔细阅读文档

  • 相关阅读:
    Java错题归纳day18
    24.缓存
    会计科目分类
    pycharm集成通义灵码
    VINS-Mono-后端优化 (三:视觉雅可比推导)
    前端实现复制功能
    探秘亚马逊云科技海外服务器 | 解析跨境云计算的前沿技术与应用
    CSP-J 2023 第二轮认证入门级(不含答案)
    eDDA(电子直接扣款授权)
    MySQL权限与安全管理之权限表与账户管理
  • 原文地址:https://blog.csdn.net/dangfulin/article/details/126779831