【问题标题】:How do I remove the time zone from a POSIXct timestamp for conversion to XTS?如何从 POSIXct 时间戳中删除时区以转换为 XTS?
【发布时间】:2020-06-03 00:25:03
【问题描述】:

由于某种原因,当我将时间序列数据从数据帧转换为 xts 对象时,时区包含在索引中。我怀疑这是我尝试在对象上运行时间序列建模时的问题,因为我不断收到错误。当我去检查 xts 对象的结构时,xts 对象内的数据以某种方式转换为 chr。它们应该是 num ,这是转换之前的原始值。以下是一些数据:

full_timestamp             PRICE
2015-01-02 10:02:27.389055  85.4
2015-01-02 10:03:30.926059  85.3
2015-01-02 10:04:52.231750  85.4
2015-01-02 10:05:37.139763  85.5
2015-01-02 10:06:54.926069  85.5
2015-01-02 10:07:57.253187  85.3

这是数据框的结构:

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   89026 obs. of  2 variables:
 $ full_timestamp: POSIXct, format: "2015-01-02 10:02:27.389055" "2015-01-02 10:03:30.926059" "2015-01-02 10:04:52.231750" ...
 $ PRICE         : num  85.4 85.3 85.4 85.5 85.5 ...

我用来将时间戳从字符向量转换为 POSIXct 时间戳的代码:

testing_eq_4xts$full_timestamp <- as.POSIXct(strptime(testing_eq_4xts$full_timestamp, 
                                                      format = "%Y-%m-%d:%H:%M:%OS",
                                                      tz = ""))

我尝试包含tz = "",根本不包含tz 部分,甚至包含Sys.unsetenv("TZ") 以阻止转换获取时区。我还应该强调,我需要时间戳中的粒度来进行建模。 这是我用来转换为 xts 的代码:

testing_eq_xts <- as.xts(testing_eq_4xts[, names(testing_eq_4xts) != "full_timestamp"],
                  order.by = testing_eq_4xts$full_timestamp, unique = F)

这就是结构的样子:

An ‘xts’ object on 2015-01-02 10:02:27.389055/2015-12-31 14:37:07.969814 containing:
  Data: num [1:89026, 1] 85.4 85.3 85.4 85.5 85.5 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr "PRICE"
  Indexed by objects of class: [POSIXct,POSIXt] TZ: 
  xts Attributes:  
 NULL

也是xts的索引:

[1] "2015-01-02 10:02:27.389055 AEDT" "2015-01-02 10:03:30.926059 AEDT"
[3] "2015-01-02 10:04:52.231750 AEDT" "2015-01-02 10:05:37.139763 AEDT"

将时间戳保留为字符向量并在转换为 xts 时尝试将其转换为 POSIXct 也不起作用,使用:

testing_eq_xts2 = xts(testing_eq_4xts[, 2], as.POSIXct(testing_eq_4xts[, 1]))

给出这个错误:

Error in as.POSIXct.default(testing_eq_4xts[, 1]) : 
  do not know how to convert 'testing_eq_4xts[, 1]' to class “POSIXct”

关于为什么 PRICE 在 xts 对象中已转换为 chr,我是否走在正确的轨道上,如果是,我该如何解决?如果我的假设不正确,那么我需要做什么来解决这个问题?谢谢。

【问题讨论】:

    标签: r timestamp rstudio xts


    【解决方案1】:

    您已经发现 'tz' 值有时是 "",但是如果您查看 ?strptime,您会发现使用 tz="" 确实是在使用您当前的时区,该时区将从您的系统中提取设置。你应该改用tz="GMT"(假设你说“无时区”时的意思是UTC/UCT。)真的没有办法有“无时区”,因为时间总是在某个时区或另一个时区测量的.

    AND ...您不能在 xts(或 zoo)对象中有 POSIXct 列(也可能不是字符值,因为您通常希望 xts 对象保存数值)。那是因为 xtszoo 对象实际上是 R 矩阵,它们不能保存具有属性的列。由于 POSIXct 对象实际上是具有“POSIXct”类属性的双精度对象(自起源以来的秒数),因此它们不能是 xts 或 zoo 矩阵中的元素。 (它们可以是 xts INDEX,因为结构的那部分有不同的规则。)

     myxts <- as.xts(read.csv.zoo(text="full_timestamp,             PRICE
     2015-01-02 10:02:27.389055,  85.4
     2015-01-02 10:03:30.926059,  85.3
     2015-01-02 10:04:52.231750,  85.4
     2015-01-02 10:05:37.139763,  85.5
     2015-01-02 10:06:54.926069,  85.5
     2015-01-02 10:07:57.253187,  85.3", sep=",", index=1, tz="GMT"))
     myxts
    #-----------------
                        [,1]
    2015-01-02 10:02:27 85.4
    2015-01-02 10:03:30 85.3
    2015-01-02 10:04:52 85.4
    2015-01-02 10:05:37 85.5
    2015-01-02 10:06:54 85.5
    2015-01-02 10:07:57 85.3
    Warning message:
    timezone of object (GMT) is different than current timezone (). 
    
     dput(myxts)
    #-------------
    structure(c(85.4, 85.3, 85.4, 85.5, 85.5, 85.3), .Dim = c(6L, 
    1L), index = structure(c(1420192947.38906, 1420193010.92606, 
    1420193092.23175, 1420193137.13976, 1420193214.92607, 1420193277.25319
    ), tzone = "GMT", tclass = c("POSIXct", "POSIXt")), class = c("xts", 
    "zoo"))
    
     index(myxts)
     #--------------
    [1] "2015-01-02 10:02:27 GMT" "2015-01-02 10:03:30 GMT" "2015-01-02 10:04:52 GMT"
    [4] "2015-01-02 10:05:37 GMT" "2015-01-02 10:06:54 GMT" "2015-01-02 10:07:57 GMT"
    

    【讨论】:

    • 将时区设置为 GMT 并没有改变任何东西,除了索引包括 GMT 而不是 AEDT。只是出于好奇,str(myxts) 对你来说是什么样的?我开始对发生的事情感到非常困惑。干杯。
    • 我给了你 dput 输出。那应该给你你需要的一切。它应该比 str 更好,但如果你真的需要 str,那么只需使用该值创建一个 myxts 并运行 str。您的对象不是 xts 对象。这是一个“小标题”。我的 dput 对象的索引确实产生了一个具有 GMT TZ 的 POSIXct 对象。我展示了我是如何做到的。你用我的完整代码得到的结果不一样吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 2018-03-23
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2016-04-08
    相关资源
    最近更新 更多