按时间戳绘制带有排序的DataFrame字段的多行

时间:2019-02-11 07:42:21

标签: dataframe julia

我正在寻找一种通过Plots.jl绘制线条(按时间戳排序)的优雅解决方案

我希望每行代表不同的年份(根据时间戳年份,即2002、2003等)来表示closeAsk(Float64)数据字段。

因此,如果我们有2002年至2019年的数据戳,如下例所示,则图表上应该有 18 条线。

julia> df2 = df[[:closeAsk, :time]]  
5000×2 DataFrame  
│ Row  │ closeAsk │ time                        │  
│      │ Float64  │ String                      │  
├──────┼──────────┼─────────────────────────────┤  
│ 1    │ 0.9949   │ 2002-11-28T22:00:00.000000Z │  
│ 2    │ 0.995    │ 2002-11-30T22:00:00.000000Z │  
⋮  
│ 4998 │ 1.13414  │ 2019-02-06T22:00:00.000000Z │  
│ 4999 │ 1.13244  │ 2019-02-07T22:00:00.000000Z │  
│ 5000 │ 1.13251  │ 2019-02-10T22:00:00.000000Z │  

我想的方法是使用理解来创建一组DataFrames来表示每年的closeAsk字段,我们将其馈送到plot(x,y),其中y是这些被屠杀的DataFrames的数组。

谢谢。

1 个答案:

答案 0 :(得分:1)

像这样使用StatsPlots.jl应该是最简单的:

using StatsPlots, Dates
d = Date.(first.(df2.time, 10))
df2.year = year.(d)
df2.day = @. dayofyear(d) + ((!isleapyear(d)) & (month(d) > 2))
@df df2 plot(:day, :closeAsk, group=:year)

请注意,我创建:day的方式是在x轴上正确对齐月日组合(控制这一事实,即在不同的年份中您可能拥有不同的交易日集合并进行a年修正)在需要的地方。)

编辑

@. dayofyear(d) + ((!isleapyear(d)) & (month(d) > 2))的解释:

  1. @.广播了此符号后的所有功能
  2. dayofyear(d):返回给定年份的天数;请注意,leap年有366天,其他年份有365天
  3. ((!isleapyear(d)) & (month(d) > 2)):如果年份不是a年且日期在2月之后,则在天数上加1,这样我们将所有年份归一化为366天(因此,月份中的同一天-日格式具有相同的天数-请注意,我们必须将+1日期从3月1日开始更改为31日,直到12月31日为止)

这是一个简短的示例(请注意2020年是leap年,而2021年不是leap年):

julia>  d = Date.(["2020-02-28", "2020-02-29", "2020-03-01", "2021-02-28", "2021-03-01"])
5-element Array{Date,1}:
 2020-02-28
 2020-02-29
 2020-03-01
 2021-02-28
 2021-03-01

julia> @. dayofyear(d) + ((!isleapyear(d)) & (month(d) > 2))
5-element Array{Int64,1}:
 59
 60
 61
 59
 61

这样,对于绘图上x轴上的相同值,所有年份始终具有一年中的同一天。