【发布时间】: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") 只是简单地提取索引并将其作为字符串提供。
我怎样才能以正确的方式做到这一点?
【问题讨论】:
我有一个索引格式为"%Y-%m-%d" 的“xts”对象,我想将索引格式更改为"%Y-%m"。
我的问题是tformat(x) <- "%Y-%m" 仅在我打印时间序列时更改格式,但我不想更改索引本身。
而format(as.Date(index(x), "%Y-%m-%d"), "%Y-%m") 只是简单地提取索引并将其作为字符串提供。
我怎样才能以正确的方式做到这一点?
【问题讨论】:
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 确切的日期时间,但是它会被打印出来。只是按照您的方式更改打印格式确实没有问题。
【讨论】:
lubridate::floor_date(df$date, "month"),并将第一次观察的日期作为索引。这会将观察结果放到进行观察的月份的第一天。格式化时,只需将日期从日期格式中删除,这样很明显您是在比较月份而不是天数。