从 Postgres 检索时如何防止列在 DataFrames 中为小数

How to prevent Columns from being Decimals in DataFrames when retrieved from Postgres

我有一个 DataFrame df ,我从 Postgres 数据库中检索如下

using DataFrames, LibPQ

con = LibPQ.Connection(con_string)
result = execute(con, "SELECT * FROM [table]")
df = DataFrame(result)
close(con)

抱歉,我无法重现此内容。

现在,DataFramesLibPQ 正在将 NUMERIC Postgres 列转换为类型 Decimals.Decimal。这可能很酷,因为尽可能准确,但当我尝试用这些列绘制任何东西时,它会出现问题。

eltype.(eachcol(df))

5-element Vector{Union}:
 Union{Missing, String}
 Union{Missing, TimeZones.ZonedDateTime}
 Union{Missing, Int32}
 Union{Missing, Date}
 Union{Missing, Decimals.Decimal}

正如 Bogumił Kamiński 很好地解释 我可以将特定类型的列更改为其他类型。需要注意的是,我什至无法测试列是否为 Union{Missing, Decimals.Decimal} 类型,因为未加载 Decimals 包。好的,我想,让我们加载 Decimals 包 - 但它不起作用,因为必须先安装包...

有没有其他方法可以将这些列变成 Float64?无需安装整个软件包?我知道我可以使用列名更改列类型,例如

df.my_column = Float64.(df.my_column)

但是我不会提前知道相关的列名

您可以像 Decimal <: AbstractFloat 一样使用 Union{Missing, AbstractFloat} 作为类型选择器。

由于 Union{Missing, AbstractFloat} 不是具体类型,您需要编写 eltype(col) <: Union{Missing, AbstractFloat} 来检查子类型条件。


顺便说一下,如果您安装了 LibPQ.jl,那么您还可以访问 Decimals.jl:

julia> LibPQ.Decimals.Decimal
Decimals.Decimal

您可以使用 identity 正确键入 DataFrame 中的每一列。

julia> df=DataFrame(A=Number[1,2],B=Union{Missing,AbstractFloat}[3,4])
2×2 DataFrame
 Row │ A       B          
     │ Number  Abstract…? 
─────┼────────────────────
   1 │      1         3.0
   2 │      2         4.0

julia> identity.(df)
2×2 DataFrame
 Row │ A      B       
     │ Int64  Float64 
─────┼────────────────
   1 │     1      3.0
   2 │     2      4.0