julia DataFrame 在多个 DateTime 范围上选择

huangapple go评论124阅读模式
英文:

julia DataFrame select over multiple DateTime ranges

问题

如何从DataFrame中选择多个日期时间范围?

  1. ranges = [(start=DateTime(0), stop=DateTime(10)), (start=DateTime(50), stop=DateTime(70))]
  2. dt_ranges = map(oh -> (df.datetime >= oh.start) & (df.datetime <= oh.stop), ranges)
  3. df[dt_ranges, j]

这不会选择这些日期时间范围。它会出现ArgError错误。

英文:

How does one select multiple datetime ranges from a DataFrame?

  1. ranges = [(start=DateTime(0),stop=DateTime(10)), (start=DateTime(50),stop=DateTime(70))]
  2. dt_ranges = map(oh -&gt; (df.datetime .&gt;= oh.start) .&amp; (df.datetime .&lt;= oh.stop), ranges)
  3. df[dt_ranges, j]

This doesn't select the ranges. It errors out with ArgError.

答案1

得分: 2

我会这样做:

  1. julia> ranges = [(start=DateTime(0),stop=DateTime(10)), (start=DateTime(50),stop=DateTime(70))]
  2. 2个元素的 Vector{NamedTuple{(:start, :stop), Tuple{DateTime, DateTime}}}:
  3. (start = DateTime("0000-01-01T00:00:00"), stop = DateTime("0010-01-01T00:00:00"))
  4. (start = DateTime("0050-01-01T00:00:00"), stop = DateTime("0070-01-01T00:00:00"))
  5. julia> inrange(ranges) = moment -> any(x -> x.start <= moment <= x.stop, ranges)
  6. inrange (拥有 1 个方法的通用函数)
  7. julia> df = DataFrame(moments = [DateTime(-1), DateTime(5), DateTime(20), DateTime(60), DateTime(80)])
  8. 5×1 DataFrame
  9. Row moments
  10. ─────┼────────────────────
  11. 1 -0001-01-01T00:00:00
  12. 2 0005-01-01T00:00:00
  13. 3 0020-01-01T00:00:00
  14. 4 0060-01-01T00:00:00
  15. 5 0080-01-01T00:00:00
  16. julia> filter(:moments => inrange(ranges), df)
  17. 2×1 DataFrame
  18. Row moments
  19. ─────┼────────────────────
  20. 1 0005-01-01T00:00:00
  21. 2 0060-01-01T00:00:00

(如果有什么不清楚的,请留下评论;请注意,inrange 是一个高阶函数,返回一个接受时间点以检查的函数)

英文:

I would do this this way:

  1. julia&gt; ranges = [(start=DateTime(0),stop=DateTime(10)), (start=DateTime(50),stop=DateTime(70))]
  2. 2-element Vector{NamedTuple{(:start, :stop), Tuple{DateTime, DateTime}}}:
  3. (start = DateTime(&quot;0000-01-01T00:00:00&quot;), stop = DateTime(&quot;0010-01-01T00:00:00&quot;))
  4. (start = DateTime(&quot;0050-01-01T00:00:00&quot;), stop = DateTime(&quot;0070-01-01T00:00:00&quot;))
  5. julia&gt; inrange(ranges) = moment -&gt; any(x -&gt; x.start &lt;= moment &lt;= x.stop, ranges)
  6. inrange (generic function with 1 method)
  7. julia&gt; df = DataFrame(moments = [DateTime(-1), DateTime(5), DateTime(20), DateTime(60), DateTime(80)])
  8. 5&#215;1 DataFrame
  9. Row moments
  10. DateTime
  11. ─────┼──────────────────────
  12. 1 -0001-01-01T00:00:00
  13. 2 0005-01-01T00:00:00
  14. 3 0020-01-01T00:00:00
  15. 4 0060-01-01T00:00:00
  16. 5 0080-01-01T00:00:00
  17. julia&gt; filter(:moments =&gt; inrange(ranges), df)
  18. 2&#215;1 DataFrame
  19. Row moments
  20. DateTime
  21. ─────┼─────────────────────
  22. 1 0005-01-01T00:00:00
  23. 2 0060-01-01T00:00:00

(if something is unclear please comment; note that inrange is a higher-order function returning a function that takes a time moment to check)

huangapple
  • 本文由 发表于 2023年7月14日 07:57:25
  • 转载请务必保留本文链接:https://go.coder-hub.com/76683928.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定