问题:
我有两个文件,一个 .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_dates
和keep_default_dates
。
根据该函数文档的说法,convert_dates
和keep_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
还请仔细阅读文档。