Pandas read_sql DataTypes

时间:2017-10-05 20:55:22

标签: python pandas dataframe type-conversion

我必须比较两个数据源,以查看所有行中相同的记录是否相同。一个数据源来自Excel文件,其中另一个来自SQL表。我尝试使用DataFrame.equals()就像我过去一样。

然而,问题是由于讨厌的数据类型问题。即使数据看起来相同,数据类型也会使excel_df.loc[excel_df['ID'] = 1].equals(sql_df.loc[sql_df['ID'] = 1])返回False。以下是pd.read_excel()的数据类型示例:

COLUMN ID                         int64
ANOTHER Id                      float64
SOME Date                datetime64[ns]
Another Date             datetime64[ns] 

来自pd.read_sql的相同列:

COLUMN ID                        float64
ANOTHER Id                       float64
SOME Date                         object
Another Date                      object

我可以尝试使用pd.read_excel()中的converters参数来匹配SQL。或者也在做df['Column_Name] = df['Column_Name].astype(dtype_here)但我正在处理很多专栏。是否有更简单的方法来检查所有列的值?

检查pd.read_sql()没有converters这样的东西,但我正在寻找类似的东西:

df = pd.read_sql("Select * From Foo", con, dtypes = ({Column_name: str,
                                                      Column_name2:int}))

2 个答案:

答案 0 :(得分:1)

怎么样

excel_df = pd.read_excel(...)
sql_df = pd.read_sql(...)

# attempt to cast all columns of excel_df to the types of sql_df
excel_df.astype(sql_df.dtypes.to_dict()).equals(sql_df)

答案 1 :(得分:-1)

如果你看到"对象" dtype表示pandas不能将某些行解释为日期,而是将整个列强制转换为Object(基本上是字符串)

查看dtypes,converter和parse_dates参数的文档: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

您还可以检查dayfirst参数以正确解析日期。