(错误)理解 `xts` 中的 `first`
(mis) understanding `first` in `xts`
我正在尝试使用 xts
函数 first
查看我的 xts
对象的第一周或第二周。我之前使用过 first
并且它的行为符合预期。这是一个表现良好的示例:
library(quantmod)
getSymbols('IBM', from='2000-01-01', to='2000-12-31')
first(IBM, "week")
#> IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
#> 2000-01-03 112.4375 116.0000 111.875 116.0000 10347700 81.97214
#> 2000-01-04 114.0000 114.5000 110.875 112.0625 8227800 79.18969
#> 2000-01-05 112.9375 119.7500 112.125 116.0000 12733200 81.97214
#> 2000-01-06 118.0000 118.9375 113.500 114.0000 7971900 80.55885
#> 2000-01-07 117.2500 117.9375 110.625 113.5000 11856700 80.20554
first(IBM, "2 weeks")
#> IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
#> 2000-01-03 112.4375 116.0000 111.875 116.0000 10347700 81.97214
#> 2000-01-04 114.0000 114.5000 110.875 112.0625 8227800 79.18969
#> 2000-01-05 112.9375 119.7500 112.125 116.0000 12733200 81.97214
#> 2000-01-06 118.0000 118.9375 113.500 114.0000 7971900 80.55885
#> 2000-01-07 117.2500 117.9375 110.625 113.5000 11856700 80.20554
#> 2000-01-10 117.2500 119.3750 115.375 118.0000 8540500 83.38549
#> 2000-01-11 117.8750 121.1250 116.625 119.0000 7873300 84.09212
#> 2000-01-12 119.6250 122.0000 118.250 119.5000 6803800 84.44543
#> 2000-01-13 119.9375 121.0000 115.750 118.2500 8489700 83.56213
#> 2000-01-14 120.9375 123.3125 117.500 119.6250 10956600 84.53379
完全符合我的预期。但是我在另一个项目中创建了另一个 xts
对象。唯一的区别(据我所知)是这些值与另一个数据集合并并用样条插值,以便每个月的第一天都有一个值。因此,该对象不是从 1 月 3 日开始,而是从 1 月 1 日开始(但仍然缺少 2 日)。用步骤重新创建有点棘手,所以我就在这里阅读它:
tst <-
structure(c(78.5624741277677, 81.972145, 79.18969, 81.972145,
80.558853, 80.205544, 83.38549, 84.092117, 84.445427, 83.562126,
84.533791, 81.795456, 84.445427, 84.092117, 85.858765, 85.858765,
84.180458, 82.502182, 80.205544, 78.836357, 79.322182, 77.732201,
80.205544, 82.767128, 81.707153, 80.647171, 84.048004, 83.031113,
84.269081, 81.616318, 82.102638, 82.854218, 81.881592, 82.589005,
79.58252, 78.521446, 76.929787, 78.167717, 76.399216, 73.923332,
72.685371), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", src = "FRED",
updated = structure(1530873556.5857, class = c("POSIXct",
"POSIXt")), class = c("xts", "zoo"), index = structure(c(946684800,
946857600, 946944000, 947030400, 947116800, 947203200, 947462400,
947548800, 947635200, 947721600, 947808000, 948153600, 948240000,
948326400, 948412800, 948672000, 948758400, 948844800, 948931200,
949017600, 949276800, 949363200, 949449600, 949536000, 949622400,
949881600, 949968000, 950054400, 950140800, 950227200, 950486400,
950572800, 950659200, 950745600, 950832000, 951177600, 951264000,
951350400, 951436800, 951696000, 951782400), tzone = "UTC", tclass = "Date"), .Dim = c(41L,
1L), .Dimnames = list(NULL, "ibm"))
现在,当我对数据执行 first
时,我没有得到我期望的结果:
first(tst, "week")
#> ibm
#> 2000-01-01 78.56247
只有一个值?如果我们看看前两周呢?
first(tst, "2 weeks")
#> ibm
#> 2000-01-01 78.56247
#> 2000-01-03 81.97214
#> 2000-01-04 79.18969
#> 2000-01-05 81.97214
#> 2000-01-06 80.55885
#> 2000-01-07 80.20554
好的,这正好给出了 1 周的数据。如果我尝试 3 weeks
我会得到这个月的前 14 天。
这是怎么回事?似乎唯一改变的是在我的数据中添加了本月第一天的观察结果,但它确实以我不理解的方式影响了 first
的行为。任何帮助表示赞赏。
如果我没记错的话,xts 内部使用 ISO 8601。这意味着 2000-01-01 不会落在第 1 周,而是落在第 52 周。因此,如果您使用 first(tst, "week")
,您将获得数据中第一周的数据,即第 52 周,并且仅包含 1记录。
如果你这样做:
lubridate::isoweek(tst)
[1] 52 1 1 1 1 1 2 2 2 2 2 3 3 3 3 4 4 4 4 4 5 5 5 5 5 6 6 6 6 6 7 7 7 7 7 8 8 8 8 9 9
您可以看到第一个日期从第 52 周开始,这与 xts 的结果相匹配。
另外to.weekly(tst)
会告诉你2000-01-01只使用了1天的数据,而下一周是基于2000-01-03到2000-01-07的数据。
我正在尝试使用 xts
函数 first
查看我的 xts
对象的第一周或第二周。我之前使用过 first
并且它的行为符合预期。这是一个表现良好的示例:
library(quantmod)
getSymbols('IBM', from='2000-01-01', to='2000-12-31')
first(IBM, "week")
#> IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
#> 2000-01-03 112.4375 116.0000 111.875 116.0000 10347700 81.97214
#> 2000-01-04 114.0000 114.5000 110.875 112.0625 8227800 79.18969
#> 2000-01-05 112.9375 119.7500 112.125 116.0000 12733200 81.97214
#> 2000-01-06 118.0000 118.9375 113.500 114.0000 7971900 80.55885
#> 2000-01-07 117.2500 117.9375 110.625 113.5000 11856700 80.20554
first(IBM, "2 weeks")
#> IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
#> 2000-01-03 112.4375 116.0000 111.875 116.0000 10347700 81.97214
#> 2000-01-04 114.0000 114.5000 110.875 112.0625 8227800 79.18969
#> 2000-01-05 112.9375 119.7500 112.125 116.0000 12733200 81.97214
#> 2000-01-06 118.0000 118.9375 113.500 114.0000 7971900 80.55885
#> 2000-01-07 117.2500 117.9375 110.625 113.5000 11856700 80.20554
#> 2000-01-10 117.2500 119.3750 115.375 118.0000 8540500 83.38549
#> 2000-01-11 117.8750 121.1250 116.625 119.0000 7873300 84.09212
#> 2000-01-12 119.6250 122.0000 118.250 119.5000 6803800 84.44543
#> 2000-01-13 119.9375 121.0000 115.750 118.2500 8489700 83.56213
#> 2000-01-14 120.9375 123.3125 117.500 119.6250 10956600 84.53379
完全符合我的预期。但是我在另一个项目中创建了另一个 xts
对象。唯一的区别(据我所知)是这些值与另一个数据集合并并用样条插值,以便每个月的第一天都有一个值。因此,该对象不是从 1 月 3 日开始,而是从 1 月 1 日开始(但仍然缺少 2 日)。用步骤重新创建有点棘手,所以我就在这里阅读它:
tst <-
structure(c(78.5624741277677, 81.972145, 79.18969, 81.972145,
80.558853, 80.205544, 83.38549, 84.092117, 84.445427, 83.562126,
84.533791, 81.795456, 84.445427, 84.092117, 85.858765, 85.858765,
84.180458, 82.502182, 80.205544, 78.836357, 79.322182, 77.732201,
80.205544, 82.767128, 81.707153, 80.647171, 84.048004, 83.031113,
84.269081, 81.616318, 82.102638, 82.854218, 81.881592, 82.589005,
79.58252, 78.521446, 76.929787, 78.167717, 76.399216, 73.923332,
72.685371), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", src = "FRED",
updated = structure(1530873556.5857, class = c("POSIXct",
"POSIXt")), class = c("xts", "zoo"), index = structure(c(946684800,
946857600, 946944000, 947030400, 947116800, 947203200, 947462400,
947548800, 947635200, 947721600, 947808000, 948153600, 948240000,
948326400, 948412800, 948672000, 948758400, 948844800, 948931200,
949017600, 949276800, 949363200, 949449600, 949536000, 949622400,
949881600, 949968000, 950054400, 950140800, 950227200, 950486400,
950572800, 950659200, 950745600, 950832000, 951177600, 951264000,
951350400, 951436800, 951696000, 951782400), tzone = "UTC", tclass = "Date"), .Dim = c(41L,
1L), .Dimnames = list(NULL, "ibm"))
现在,当我对数据执行 first
时,我没有得到我期望的结果:
first(tst, "week")
#> ibm
#> 2000-01-01 78.56247
只有一个值?如果我们看看前两周呢?
first(tst, "2 weeks")
#> ibm
#> 2000-01-01 78.56247
#> 2000-01-03 81.97214
#> 2000-01-04 79.18969
#> 2000-01-05 81.97214
#> 2000-01-06 80.55885
#> 2000-01-07 80.20554
好的,这正好给出了 1 周的数据。如果我尝试 3 weeks
我会得到这个月的前 14 天。
这是怎么回事?似乎唯一改变的是在我的数据中添加了本月第一天的观察结果,但它确实以我不理解的方式影响了 first
的行为。任何帮助表示赞赏。
如果我没记错的话,xts 内部使用 ISO 8601。这意味着 2000-01-01 不会落在第 1 周,而是落在第 52 周。因此,如果您使用 first(tst, "week")
,您将获得数据中第一周的数据,即第 52 周,并且仅包含 1记录。
如果你这样做:
lubridate::isoweek(tst)
[1] 52 1 1 1 1 1 2 2 2 2 2 3 3 3 3 4 4 4 4 4 5 5 5 5 5 6 6 6 6 6 7 7 7 7 7 8 8 8 8 9 9
您可以看到第一个日期从第 52 周开始,这与 xts 的结果相匹配。
另外to.weekly(tst)
会告诉你2000-01-01只使用了1天的数据,而下一周是基于2000-01-03到2000-01-07的数据。