Julia 数据帧的日期时间

Datetimes for Julia dataframes

pandas有很多handy utilities for manipulating datetime indices。 Julia 中有类似的功能吗?我还没有找到任何关于处理这些东西的教程,尽管它显然是可能的。

pandas 实用程序的一些示例:

dti = pd.to_datetime(
    ["1/1/2018", np.datetime64("2018-01-01"), 
datetime.datetime(2018, 1, 1)]
)

dti = pd.date_range("2018-01-01", periods=3, freq="H")

dti = dti.tz_localize("UTC")

dti.tz_convert("US/Pacific")

idx = pd.date_range("2018-01-01", periods=5, freq="H")
ts = pd.Series(range(len(idx)), index=idx)
ts.resample("2H").mean()

Julia 图书馆有“只做一件事,但要把它做好”的哲学,所以它的图书馆布局可能更符合 Unix(允许实现共同目标的小工具电池)而不是 Python的。 因此,您有单独的 DataFrame 和 Dates 库:

julia> using Dates, DataFrames

浏览教程中的一些示例:

Pandas

dti = pd.to_datetime(
    ["1/1/2018", np.datetime64("2018-01-01"), datetime.datetime(2018, 1, 1)]
)

茱莉亚

julia> DataFrame(dti=[Date("1/1/2018", "m/d/y"), Date("2018-01-01"), Date(2018,1,1)])
3×1 DataFrame
 Row │ dti
     │ Date
─────┼────────────
   1 │ 2018-01-01
   2 │ 2018-01-01
   3 │ 2018-01-01

Pandas

dti = pd.date_range("2018-01-01", periods=3, freq="H")

茱莉亚

julia> DateTime("2018-01-01")  .+ Hour.(0:2)
3-element Vector{DateTime}:
 2018-01-01T00:00:00
 2018-01-01T01:00:00
 2018-01-01T02:00:00

Pandas

dti = dti.tz_localize("UTC")

dti.tz_convert("US/Pacific")

茱莉亚

请注意,Julia 中有一个单独的时区库。此外,"US/Pacific" 是时区的旧名称。

julia> using TimeZones

julia> dti = ZonedDateTime.(dti, tz"UTC")
3-element Vector{ZonedDateTime}:
 2018-01-01T00:00:00+00:00
 2018-01-01T01:00:00+00:00
 2018-01-01T02:00:00+00:00

julia> julia> astimezone.(dti, TimeZone("US/Pacific", TimeZones.Class(:LEGACY)))
3-element Vector{ZonedDateTime}:
 2017-12-31T16:00:00-08:00
 2017-12-31T17:00:00-08:00
 2017-12-31T18:00:00-08:00

Pandas

idx = pd.date_range("2018-01-01", periods=5, freq="H")
ts = pd.Series(range(len(idx)), index=idx)
ts.resample("2H").mean()

茱莉亚

对于重采样或其他复杂操作,您需要使用拆分-应用-组合模式(请参阅 https://docs.juliahub.com/DataFrames/AR9oZ/1.3.1/man/split_apply_combine/

julia> df = DataFrame(date=DateTime("2018-01-01")  .+ Hour.(0:4), vals=1:5)
5×2 DataFrame
 Row │ date                 vals
     │ DateTime             Int64
─────┼────────────────────────────
   1 │ 2018-01-01T00:00:00      1
   2 │ 2018-01-01T01:00:00      2
   3 │ 2018-01-01T02:00:00      3
   4 │ 2018-01-01T03:00:00      4
   5 │ 2018-01-01T04:00:00      5
julia> df.date2 = floor.(df.date, Hour(2));

julia> using StatsBase

julia> combine(groupby(df, :date2), :date2, :vals => mean => :vals_mean)
5×2 DataFrame
 Row │ date2                vals_mean
     │ DateTime             Float64
─────┼────────────────────────────────
   1 │ 2018-01-01T00:00:00        1.5
   2 │ 2018-01-01T00:00:00        1.5
   3 │ 2018-01-01T02:00:00        3.5
   4 │ 2018-01-01T02:00:00        3.5
   5 │ 2018-01-01T04:00:00        5.0