我正在寻找一种通过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的数组。
谢谢。
答案 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))
的解释:
@.
广播了此符号后的所有功能dayofyear(d)
:返回给定年份的天数;请注意,leap年有366天,其他年份有365天((!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轴上的相同值,所有年份始终具有一年中的同一天。