从 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)
抱歉,我无法重现此内容。
现在,DataFrames
或 LibPQ
正在将 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
我有一个 DataFrame
df
,我从 Postgres 数据库中检索如下
using DataFrames, LibPQ
con = LibPQ.Connection(con_string)
result = execute(con, "SELECT * FROM [table]")
df = DataFrame(result)
close(con)
抱歉,我无法重现此内容。
现在,DataFrames
或 LibPQ
正在将 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