Julia 数据帧的日期时间

Igo*_*vin 4 julia dataframes.jl

pandas有许多非常方便的实用程序用于操作日期时间索引。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()
Run Code Online (Sandbox Code Playgroud)

Prz*_*fel 15

Julia 库的理念是“只做一件事,但要把它做好”,因此它的库的布局可能更符合 Unix(一组允许实现共同目标的小工具),而不是 Python 的。\n因此你有单独的库数据帧和日期的库:

\n
julia> using Dates, DataFrames\n
Run Code Online (Sandbox Code Playgroud)\n

浏览一下教程中的一些示例:

\n

熊猫

\n
dti = pd.to_datetime(\n    ["1/1/2018", np.datetime64("2018-01-01"), datetime.datetime(2018, 1, 1)]\n)\n
Run Code Online (Sandbox Code Playgroud)\n

朱莉娅

\n
julia> DataFrame(dti=[Date("1/1/2018", "m/d/y"), Date("2018-01-01"), Date(2018,1,1)])\n3\xc3\x971 DataFrame\n Row \xe2\x94\x82 dti\n     \xe2\x94\x82 Date\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 2018-01-01\n   2 \xe2\x94\x82 2018-01-01\n   3 \xe2\x94\x82 2018-01-01\n
Run Code Online (Sandbox Code Playgroud)\n

熊猫

\n
dti = pd.date_range("2018-01-01", periods=3, freq="H")\n
Run Code Online (Sandbox Code Playgroud)\n

朱莉娅

\n
julia> DateTime("2018-01-01")  .+ Hour.(0:2)\n3-element Vector{DateTime}:\n 2018-01-01T00:00:00\n 2018-01-01T01:00:00\n 2018-01-01T02:00:00\n
Run Code Online (Sandbox Code Playgroud)\n

熊猫

\n
dti = dti.tz_localize("UTC")\n\ndti.tz_convert("US/Pacific")\n
Run Code Online (Sandbox Code Playgroud)\n

朱莉娅

\n

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

\n
julia> using TimeZones\n\njulia> dti = ZonedDateTime.(dti, tz"UTC")\n3-element Vector{ZonedDateTime}:\n 2018-01-01T00:00:00+00:00\n 2018-01-01T01:00:00+00:00\n 2018-01-01T02:00:00+00:00\n\njulia> julia> astimezone.(dti, TimeZone("US/Pacific", TimeZones.Class(:LEGACY)))\n3-element Vector{ZonedDateTime}:\n 2017-12-31T16:00:00-08:00\n 2017-12-31T17:00:00-08:00\n 2017-12-31T18:00:00-08:00\n
Run Code Online (Sandbox Code Playgroud)\n

熊猫

\n
idx = pd.date_range("2018-01-01", periods=5, freq="H")\nts = pd.Series(range(len(idx)), index=idx)\nts.resample("2H").mean()\n
Run Code Online (Sandbox Code Playgroud)\n

朱莉娅

\n

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

\n
julia> df = DataFrame(date=DateTime("2018-01-01")  .+ Hour.(0:4), vals=1:5)\n5\xc3\x972 DataFrame\n Row \xe2\x94\x82 date                 vals\n     \xe2\x94\x82 DateTime             Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 2018-01-01T00:00:00      1\n   2 \xe2\x94\x82 2018-01-01T01:00:00      2\n   3 \xe2\x94\x82 2018-01-01T02:00:00      3\n   4 \xe2\x94\x82 2018-01-01T03:00:00      4\n   5 \xe2\x94\x82 2018-01-01T04:00:00      5\njulia> df.date2 = floor.(df.date, Hour(2));\n\njulia> using StatsBase\n\njulia> combine(groupby(df, :date2), :date2, :vals => mean => :vals_mean)\n5\xc3\x972 DataFrame\n Row \xe2\x94\x82 date2                vals_mean\n     \xe2\x94\x82 DateTime             Float64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 2018-01-01T00:00:00        1.5\n   2 \xe2\x94\x82 2018-01-01T00:00:00        1.5\n   3 \xe2\x94\x82 2018-01-01T02:00:00        3.5\n   4 \xe2\x94\x82 2018-01-01T02:00:00        3.5\n   5 \xe2\x94\x82 2018-01-01T04:00:00        5.0\n
Run Code Online (Sandbox Code Playgroud)\n

  • 谢谢,这非常有帮助,但是人们想做的一件事是重新采样,或者例如选择上午 9 点到中午(或其他)之间的时间戳。另外,您的范围示例故意很简单 - 如果我的日期范围是工作日怎么办 - 那么像您描述的那样会有点麻烦。 (2认同)