【问题标题】:Changing index format of xts更改 xts 的索引格式
【发布时间】:2021-03-17 22:11:01
【问题描述】:

我有一个索引格式为"%Y-%m-%d" 的“xts”对象,我想将索引格式更改为"%Y-%m"

我的问题是tformat(x) <- "%Y-%m" 仅在我打印时间序列时更改格式,但我不想更改索引本身。

format(as.Date(index(x), "%Y-%m-%d"), "%Y-%m") 只是简单地提取索引并将其作为字符串提供。

我怎样才能以正确的方式做到这一点?

【问题讨论】:

    标签: r xts


    【解决方案1】:

    xts 对象的索引实际上存储为表示为数字的日期,无论您选择如何格式化它都不会改变。

    例如,我们以下面的对象为例:

    library(xts)
    
    x <- xts(1:12, seq(as.Date("2020-01-01"), by = "month", length.out = 12))
    
    x
    #>            [,1]
    #> 2020-01-01    1
    #> 2020-02-01    2
    #> 2020-03-01    3
    #> 2020-04-01    4
    #> 2020-05-01    5
    #> 2020-06-01    6
    #> 2020-07-01    7
    #> 2020-08-01    8
    #> 2020-09-01    9
    #> 2020-10-01   10
    #> 2020-11-01   11
    #> 2020-12-01   12
    

    现在我们可以unclassx 看到它“真的”是一个带有一些属性的数组。其中之一是以数字格式存储的日期"index"

    unclass(x)
    #>       [,1]
    #>  [1,]    1
    #>  [2,]    2
    #>  [3,]    3
    #>  [4,]    4
    #>  [5,]    5
    #>  [6,]    6
    #>  [7,]    7
    #>  [8,]    8
    #>  [9,]    9
    #> [10,]   10
    #> [11,]   11
    #> [12,]   12
    #> attr(,"index")
    #>  [1] 1577836800 1580515200 1583020800 1585699200 1588291200 1590969600
    #>  [7] 1593561600 1596240000 1598918400 1601510400 1604188800 1606780800
    #> attr(,"index")attr(,"tzone")
    #> [1] "UTC"
    #> attr(,"index")attr(,"tclass")
    #> [1] "Date"
    

    所以现在让我们更改格式:

    tformat(x) <- "%Y-%m"
    
    x
    #>         [,1]
    #> 2020-01    1
    #> 2020-02    2
    #> 2020-03    3
    #> 2020-04    4
    #> 2020-05    5
    #> 2020-06    6
    #> 2020-07    7
    #> 2020-08    8
    #> 2020-09    9
    #> 2020-10   10
    #> 2020-11   11
    #> 2020-12   12
    

    当我们再次unclass 时,我们看到"index" 属性没有改变,尽管格式已经改变:

    unclass(x)
    #>       [,1]
    #>  [1,]    1
    #>  [2,]    2
    #>  [3,]    3
    #>  [4,]    4
    #>  [5,]    5
    #>  [6,]    6
    #>  [7,]    7
    #>  [8,]    8
    #>  [9,]    9
    #> [10,]   10
    #> [11,]   11
    #> [12,]   12
    #> attr(,"index")
    #>  [1] 1577836800 1580515200 1583020800 1585699200 1588291200 1590969600
    #>  [7] 1593561600 1596240000 1598918400 1601510400 1604188800 1606780800
    #> attr(,"index")attr(,"tzone")
    #> [1] "UTC"
    #> attr(,"index")attr(,"tclass")
    #> [1] "Date"
    #> attr(,"index")attr(,"tformat")
    #> [1] "%Y-%m"
    

    因此,当您说要更改索引本身时,不清楚您的意思。索引必须在内部表示为 some 确切的日期时间,但是它会被打印出来。只是按照您的方式更改打印格式确实没有问题。

    【讨论】:

    • 好吧,问题是我有另一个带有月度数据的df,我想将两者合并,但是一个将每个月的第一天作为索引,另一个将第一次观察的日期作为索引..所以他们不完全匹配
    • @ITsMe 所以听起来你正在尝试做的是围绕日期,以便它们匹配。如果您希望它们匹配,您需要更改记录的实际日期 - 您不能只要求 xts 使索引有点模糊。最简单的方法是在数据框中使用lubridate::floor_date(df$date, "month"),并将第一次观察的日期作为索引。这会将观察结果放到进行观察的月份的第一天。格式化时,只需将日期从日期格式中删除,这样很明显您是在比较月份而不是天数。
    • 谢谢。这对我有用,尽管对我来说有点烦人,操纵 xts 本身的索引是如此复杂
    猜你喜欢
    • 2015-09-28
    • 1970-01-01
    • 2022-01-24
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    相关资源
    最近更新 更多