首页 文章

在Julia制作季度时间序列

提问于
浏览
3

在Julia中,我们可以使用以下代码创建时间数组:

d = [date(1980,1,1):date(2015,1,1)];
t = TimeArray(d,rand(length(d)),["test"])

这将为我们提供每日数据 . 如何获得季度或年度时间序列?

3 回答

  • 2

    仅使用Base.range的可选步骤功能与Datetime.Period类型组合使用

    julia> [Date(1980,1,1):Month(3):Date(2015,1,1)]
    141-element Array{Date{ISOCalendar},1}:
     1980-01-01
     1980-04-01
     1980-07-01
     1980-10-01
     1981-01-01
     1981-04-01
     ...
    

    并根据需要更改步骤

    julia> [Date(1980,1,1):Year(1):Date(2015,1,1)]
    36-element Array{Date{ISOCalendar},1}:
     1980-01-01
     1981-01-01
     1982-01-01
     ...
    

    0.3. x vs 0.4.x.

    在版本0.3.x中日期包含Dates提供模块 Dates ,但在版本0.4.x中,模块 Dates 是内置的 . 另外(当前)另一个细微差别是 YearMonth 必须作为 Dates.YearDates.Month 访问在版本0.4.x.

  • 5

    我知道这个问题有点旧,但值得补充的是,还有另一个名为Temporal *的时间序列包,它具有此功能 .

    以下是一些示例用法:

    using Temporal, Base.Dates
    date_array = collect(today()-Day(365):Day(1):today())
    random_walk = cumsum(randn(length(date_array))) + 100.0
    

    构造时间序列对象(类型 TS ) . 最后一个参数用于列名,但如果没有给出,则会自动生成默认列名 .

    ts_data = TS(random_walk, date_array, :RandomWalk)
    # Index       RandomWalk
    # 2016-08-24  99.8769
    # 2016-08-25  99.1643
    # 2016-08-26  98.8918
    # 2016-08-27  97.7265
    # 2016-08-28  97.9675
    # 2016-08-29  97.7151
    # 2016-08-30  97.0279
    # ⋮
    # 2017-08-17  81.2998
    # 2017-08-18  82.0658
    # 2017-08-19  82.1941
    # 2017-08-20  81.9021
    # 2017-08-21  81.8163
    # 2017-08-22  81.5406
    # 2017-08-23  81.2229
    # 2017-08-24  79.2867
    

    获取每个季度的最后一次观察(类似的逻辑分别使用 eoweomeoy 存在数周,数月和数年):

    eoq(ts_data)  # get the last observation at every quarter
    # 4x1 Temporal.TS{Float64,Date}: 2016-09-30 to 2017-06-30
    # Index       RandomWalk
    # 2016-09-30  88.5629
    # 2016-12-31  82.1014
    # 2017-03-31  84.9065
    # 2017-06-30  92.1997
    

    也可以使用函数来按照上面给出的相同类型的周期来聚合数据 .

    collapse(ts_data, eoq, fun=mean)  # get the average value every quarter
    # 4x1 Temporal.TS{Float64,Date}: 2016-09-30 to 2017-06-30
    # Index       RandomWalk
    # 2016-09-30  92.5282
    # 2016-12-31  86.8291
    # 2017-03-31  89.1391
    # 2017-06-30  90.3982
    

    *(免责声明:我是包裹作者 . )

  • 1

    尚未支持季度,但支持其他时间段,如周,月和年 . 有一种名为 collapse 的方法,用于将TimeArray转换为更大的时间范围 .

    d = [Date(1980,1,1):Date(2015,1,1)];
    t = TimeArray(d,rand(length(d)),["test"])
    
    c = collapse(t, last, period=year)
    

    返回以下内容

    36x1 TimeArray{Float64,1} 1980-12-31 to 2015-01-01
    
                 test
    1980-12-31 | 0.94
    1981-12-31 | 0.37
    1982-12-31 | 0.12
    1983-12-31 | 0.64
    ⋮
    2012-12-31 | 0.43
    2013-12-31 | 0.81
    2014-12-31 | 0.88
    2015-01-01 | 0.55
    

    此外,请注意 date 已被弃用,而不是 Date ,因为新的更新包现在运行下面的日期/时间函数 .

相关问题