【问题标题】:Datetimes for Julia dataframesJulia 数据帧的日期时间
【发布时间】:2021-12-27 01:46:42
【问题描述】:

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 中的任何库的文档中获取此信息
  • @sammywemmy 我也愿意相信这一点,但现实并不同​​意。
  • Julia 有一个标准库 Dates,非常不错。 DataFrames 接受任何元素类型。您可能正在寻找一起使用它们的文档,但没有找到,因为假设像这样的东西在没有特殊情况的情况下可以很好地协同工作。如果您有特殊的障碍,我相信人们可以帮助您解决更有针对性的问题。
  • 每 @mcabbot 的评论数据/时间处理随 Julia Base 一起提供,您可以在此处找到文档 docs.julialang.org/en/v1/stdlib/Dates。如果您缺少特定功能,请更新指向您遇到的特定问题的问题,然后可以重新打开并回答它。
  • 伙计们,这个问题现在是一个很好的教程,几分钟前由非 Julia 社区的人关闭。我投票重新打开它:)

标签: julia dataframes.jl


【解决方案1】:

Julia 库具有“只做一件事,但做正确”的理念,因此其库的布局可能更符合 Unix(允许实现共同目标的小型工具的电池)而不是 Python 的。 因此,您有单独的 DataFrames 和 Dates 库:

julia> using Dates, DataFrames

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

熊猫

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

熊猫

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

熊猫

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

熊猫

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

朱莉娅

对于重采样或其他复杂操作,您需要使用 split-apply-combine 模式(请参阅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

【讨论】:

  • 谢谢,这很有帮助,但人们想做的事情是重新采样,或者,例如,选择上午 9 点到中午(或其他任何时间)之间的时间戳。另外,您的范围示例故意很简单-如果我的日期范围是工作日怎么办-那么像您描述的那样有点麻烦。
  • 我添加了重采样。对于工作日,这将取决于您的日历 - 但基本上模式将是相似的。也许这是一个很好的单独问题。
猜你喜欢
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 2019-07-02
  • 2021-01-20
  • 2015-03-22
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多