首页 > 解决方案 > Julia:将 Float64 转换为日期和日期时间

问题描述

在 Julia 我有一个像2018.003828474404. 这个 Float 应该被解释为代表DateTime(2018,1,2,9,53,1). 这里的.003828474404浮动部分代表自 2018 年初以来过去一年的比例。

  1. 如何从 转换Float64DateTime.
  2. 如何从 转换Float64Date. 这将失去精度和风险,InexactError()但就我的目的而言,最近的一天就可以了。

标签: julia

解决方案


尽管相对于一年而言它似乎是一个固定数量,但0.003828...之后的值2018代表了2018 年至 2019 年之间特定年份的一小部分,因为所有年份的长度都略有不同(例如闰年)。Dates认真对待这个事实。

我们可以定义以下函数partial_year来计算具有指定精度的结果(默认为Nanosecond,由 提供的最具体的Dates)。

using Dates

function partial_year(period::Type{<:Period}, float::AbstractFloat)
    _year, Δ = divrem(float, 1)
    year_start = DateTime(_year)
    year = period((year_start + Year(1)) - year_start)
    partial = period(round(Dates.value(year) * Δ))
    year_start + partial
end
partial_year(float::AbstractFloat) = partial_year(Nanosecond, float)

首先,我们从一年的剩余部分中分离出起始年份。我们使用Dates时间段处理来计算指定年份的确切长度,并将其转换period为我们所需精度的类型。我们将此year值乘以年份的分数,将结果四舍五入(因为Period不允许使用小数),然后将其转换回 a period。最后,我们将partial今年添加到year_start.

正如预期的那样,我们可以在您的示例中使用它,具有各种精度:

julia> partial_year(2018.003828474404)
2018-01-02T09:32:14.768

julia> partial_year(Minute, 2018.003828474404)
2018-01-02T09:32:00

推荐阅读