【问题标题】:R: changing timezone of an xts object after aggregationR:聚合后更改 xts 对象的时区
【发布时间】:2016-06-14 22:02:03
【问题描述】:

我有一个单变量时间序列对象,我将其转换为 xts 对象,以便使用 aggregatets() 函数。这是它的样子:

> head(B, 20)
                    [,1]
2015-09-16 09:16:00    1
2015-09-16 09:16:26    1
2015-09-16 09:16:46    1
2015-09-16 09:17:28   -1
2015-09-16 09:19:17    1
2015-09-16 09:22:06   -1

时区是“IST”(印度标准时间),如上所示。当我在其上运行聚合函数时,它会将时区更改为“GMT”。我需要它留在“IST”中,因为我需要比较“IST”时区中的其他变量。它还会显示一条警告消息:

> C<- aggregatets(B, FUN = "sum")
> head(C, 20)
                    ts3
2015-09-16 03:47:00   3
2015-09-16 03:48:00  -1
2015-09-16 03:49:00  NA
2015-09-16 03:50:00   1
2015-09-16 03:51:00  NA
2015-09-16 03:52:00  NA
Warning message:
timezone of object (GMT) is different than current timezone ().

我也尝试通过 indexTZ() 函数手动更改时区,但这也无济于事。

> indexTZ(C)<- "IST"
> head(C)
                    ts3
2015-09-16 03:47:00   3
2015-09-16 03:48:00  -1
2015-09-16 03:49:00  NA
2015-09-16 03:50:00   1
2015-09-16 03:51:00  NA
2015-09-16 03:52:00  NA
Warning message:
timezone of object (IST) is different than current timezone ().

我还尝试更改聚合函数本身中的时区选择以创建一个新函数,但它仍然吐出同样的东西。

这真的很奇怪,因为我在尝试分析的其他一些变量中使用了相同的方法,但它并没有给我同样的问题。

如果我遗漏了一些东西,或者我应该如何解决我的问题并将该系列保持在“IST”中,有人可以说明一下吗? 任何帮助将不胜感激,如果您需要更多信息,请告诉我。

编辑:按要求添加

whole_data<- read.csv(file = file,header = FALSE,sep = "", col.names = c("DateTime","Seq","BP1","BQ1","BO1","AP1","AQ1","AO1","BP2","BQ2","BO2","AP2","AQ2","AO2","BP3","BQ3","BO3","AP3","AQ3","AO3","BP4","BQ4","BO4","AP4","AQ4","AO4","BP5","BQ5","BO5","AP5","AQ5","AO5","BP6","BQ6","BO6","AP6","AQ6","AO6","BP7","BQ7","BO7","AP7","AQ7","AO7","BP8","BQ8","BO8","AP8","AQ8","AO8","BP9","BQ9","BO9","AP9","AQ9","AO9","BP10","BQ10","BO10","AP10","AQ10","AO10"), colClasses = c(NA, rep("integer",31), rep("NULL", 30)))
  whole_data<- whole_data[which(whole_data$DateTime != 0),]
  whole_data$DateTime= as.POSIXct(whole_data$DateTime/(10^9), origin="1970-01-01")

trades<- whole_data[!complete.cases(whole_data),]
          colnames(trades) <- c("DateTime", "Seq", "Price", "Qty", "TradeSide")
          trades[,5][trades[,5]==2]<- -1
          B<- as.xts(trades$TradeSide, order.by = trades$DateTime)
          C<- aggregatets(B, FUN = "sum", on = on, k = k)

整个数据集很大。对于这个特定的变量,我只需要交易行,所以我可以通过 !complete.cases

访问

我仍然无法解决这个问题。你能对此有所了解吗?

【问题讨论】:

    标签: r datetime time aggregate xts


    【解决方案1】:

    你是如何定义 B 的?它是什么data.frame?里面的 1 和 -1 值是什么?看起来它在同一列中。可能是时区信息吗?

    看看How to get the beginning of the day in POSIXct,那里也有一些令我惊讶的时区效应。

    编辑 20160309: 我认为使用没有时区的原点会导致它使用 GMT。但是我没有时间尝试。
    也许你可以试试下面的代码

    whole_data$DateTime= as.POSIXct(whole_data$DateTime/(10^9), origin="1970-01-01", tz="IST")
    

    【讨论】:

    • 它绝对不在同一列,也不是时区信息。 B 是我从 data.frame 转换为 xts 对象的买卖订单的时间序列。
    • 你能给出你用来生成B的代码和底层数据框吗?当我尝试将包含您的数据的 data.frame 转换为 xts 时,出现 as.POSIXlt.character 转换错误。
    • 您要求的发布代码。抱歉延迟回复。
    • @UtdMan,恐怕我现在没时间了。我希望我能在星期五看看。令我惊讶的是,您将 DateTime 除以 10^9。它可能与您的问题无关,但我想知道为什么。您可以从文件中为 DateTime 提供示例值吗?请参阅我的答案中的编辑。这可能是你真正的问题。
    • 我除以 10^9 因为我的时间戳以纳秒为单位。仅当我汇总数据且没有其他内容时才会出现问题
    【解决方案2】:

    尝试使用attr(index(C), "tzone") = "IST"

    【讨论】:

    • 这更适合作为评论。
    猜你喜欢
    • 2014-11-14
    • 2014-04-12
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 2018-06-08
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多