无效' tz'价值,时区问题

时间:2017-01-14 10:23:13

标签: r timezone xts

我正在使用纳斯达克的分钟数据,它的索引为"2015-07-13 12:05:00 EST"。我用Sys.setenv(TZ = 'EST')调整了系统时间。

我想编制一个简单的买入/持有/卖出策略,因此我创建了一个平仓的向量作为基础。

pos_flat <- xts(rep(0, nrow(NASDAQ)), index(NASDAQ))

然后我想应用一个约束,在某个时间窗口中,位置必须是平的,在我的情况下意味着等于1.

pos_flat["T13:41/T14:00"] <- 1

这会返回错误:

"Error in as.POSIXlt.POSIXct(.POSIXct(.index(x)), tz = indexTZ(x)) :invalid 'tz' value".

我也在进行其他计算时遇到此错误,我只是使用了这个示例,因为它很简单并且显示了问题。

作为额外信息:

> Sys.timezone 
function (location = TRUE) 
{
    tz <- Sys.getenv("TZ", names = FALSE)
    if (nzchar(tz)) 
        return(tz)
    if (location) 
        return(.Internal(tzone_name()))
    z <- as.POSIXlt(Sys.time())
    zz <- attr(z, "tzone")
    if (length(zz) == 3L) 
        zz[2L + z$isdst]
    else zz[1L]
}
<bytecode: 0x03648ff4>
<environment: namespace:base>

我不理解tz值的问题......有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您收到错误是因为"EST"不是有效的时区规范。它是打印和显示时区时经常使用的缩写。

索引打印为"2015-07-13 12:05:00 EST",因为"EST"可能代表美国的东部标准时间。如果要将TZ环境变量设置为该时区,则应使用带有国家/城市表示法的Sys.setenv()

Sys.setenv(TZ = "America/New_York")

您还可以在xts构造函数中设置时区:

pos_flat <- xts(rep(0, nrow(NASDAQ)), index(NASDAQ), tzone = "America/New_York")

答案 1 :(得分:2)

“无效'tz'值”错误的来源是因为无论出于何种原因,R不接受tz = df$var。如果您设置tz = 'America/New_York'或其他一些字符值,那么它将起作用。

更好地回答(而不是使用下面的force_tz)将UTC时间转换为基于位置的各种时区。它比循环或使用嵌套的ifelse更简单,更好。我根据时区列(我的数据已经存在,如果没有你可以创建它)来子集和更改tz。只需确保您考虑数据中的所有时区

(unique(df$timezone))   
df$datetime2[df$timezone == 'America/New_York'] <- format(df$datetime, tz="America/New_York")[df$timezone == 'America/New_York']
df$datetime2[df$timezone == 'America/Chicago'] <- format(df$datetime, tz="America/Chicago")[df$timezone == 'America/Chicago']
df$datetime2[df$timezone == 'America/Denver'] <- format(df$datetime, tz="America/Denver")[df$timezone == 'America/Denver']
df$datetime2[df$timezone == 'America/Los_Angeles'] <- format(df$datetime, tz="America/Los_Angeles")[df$timezone == 'America/Los_Angeles']

以前的解决方案:Converting to Local Time in R - Vector of Timezones

require(lubridate)
require(dplyr)

df = data.frame(timestring = c("2015-12-12 13:34:56", "2015-12-14 16:23:32"), localzone = c("America/Los_Angeles", "America/New_York"), stringsAsFactors = F)

df$moment = as.POSIXct(df$timestring, format="%Y-%m-%d %H:%M:%S", tz="UTC")

df = df %>% rowwise() %>% mutate(localtime = force_tz(moment, localzone))

df

答案 2 :(得分:-1)

您的错误是由于对时间对象的误解而发生的。您需要拥有UNIX时间戳才能使用类似

的内容

pos_flat["T13:41/T14:00"] <- 1

通过执行以下操作来尝试转换索引:

index(NASDAQ) <- as.POSIXct(strptime(index(NASDAQ), "%Y-%m-%d %H:%M:%S"))

由于您想使用EST,您必须更改您的环境变量(如果您不在EST时区中)。总而言之,这应该有效:

Sys.setenv(TZ = 'EST')
#load stuff
#...
index(NASDAQ) <- as.POSIXct(strptime(index(NASDAQ), "%Y-%m-%d %H:%M:%S"))
pos_flat <- xts(rep(0, nrow(NASDAQ)), index(NASDAQ))
pos_flat["T13:41/T14:00"] <- 1

有关详细信息,请查看R。

中的POSIXct和POSIXlt结构

祝你好运