朱莉娅:将Float64转换为Date和DateTime

时间:2018-07-19 21:59:52

标签: julia

在Julia中,我有一个2018.003828474404之类的浮点数。浮点数应解释为代表DateTime(2018,1,2,9,53,1)。浮点数的.003828474404分量代表自2018年初以来经过的那一年的比例。

  1. 如何将Float64转换为DateTime
  2. 如何将Float64转换为Date。这样会失去精度,并有InexactError()的风险,但就我的目的而言,最近的一天就可以了。

1 个答案:

答案 0 :(得分:2)

尽管相对于一年来说,这似乎是一个固定的数量,但是0.003828...之后的2018值代表的是特定年份 在2018年至2019年之间的一小部分,因为所有年的长度略有不同(例如,leap年)。 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,然后将其转换回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