无效 'tz' 值,时区问题
invalid 'tz' value, problems with time zone
我正在处理纳斯达克的分钟数据,它有索引 "2015-07-13 12:05:00 EST"
。我用Sys.setenv(TZ = 'EST')
.
调整了系统时间
我想编写一个简单的 buy/hold/sell 策略,因此我创建了一个平仓矢量作为基础。
pos_flat <- xts(rep(0, nrow(NASDAQ)), index(NASDAQ))
然后我想应用一个约束,在某个时间 window,仓位必然是平的,在我的例子中等于 1。
pos_flat["T13:41/T14:00"] <- 1
而这个 returns 错误:
"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 值的问题...有什么想法吗?
您遇到错误是因为 "EST"
不是有效的时区规范。这是打印和显示时区时经常使用的缩写。
索引打印为 "2015-07-13 12:05:00 EST"
因为 "EST"
可能代表美国东部标准时间。如果要将 TZ
环境变量设置为该时区,则应使用 Sys.setenv()
和 Country/City 表示法:
Sys.setenv(TZ = "America/New_York")
您还可以在xts
构造函数中设置时区:
pos_flat <- xts(rep(0, nrow(NASDAQ)), index(NASDAQ), tzone = "America/New_York")
您的错误是由于对时间对象的错误解释而发生的。您需要有 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 结构。
此致
您的 "invalid 'tz' value" 错误的来源是因为,无论出于何种原因,R 不接受 tz = df$var
。如果您设置 tz = 'America/New_York'
或其他一些字符值,那么它将起作用。
根据位置将 UTC 时间转换为不同时区的更好答案(而不是使用下面的 force_tz)。它也比循环或使用嵌套的 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
我正在处理纳斯达克的分钟数据,它有索引 "2015-07-13 12:05:00 EST"
。我用Sys.setenv(TZ = 'EST')
.
我想编写一个简单的 buy/hold/sell 策略,因此我创建了一个平仓矢量作为基础。
pos_flat <- xts(rep(0, nrow(NASDAQ)), index(NASDAQ))
然后我想应用一个约束,在某个时间 window,仓位必然是平的,在我的例子中等于 1。
pos_flat["T13:41/T14:00"] <- 1
而这个 returns 错误:
"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 值的问题...有什么想法吗?
您遇到错误是因为 "EST"
不是有效的时区规范。这是打印和显示时区时经常使用的缩写。
索引打印为 "2015-07-13 12:05:00 EST"
因为 "EST"
可能代表美国东部标准时间。如果要将 TZ
环境变量设置为该时区,则应使用 Sys.setenv()
和 Country/City 表示法:
Sys.setenv(TZ = "America/New_York")
您还可以在xts
构造函数中设置时区:
pos_flat <- xts(rep(0, nrow(NASDAQ)), index(NASDAQ), tzone = "America/New_York")
您的错误是由于对时间对象的错误解释而发生的。您需要有 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 结构。
此致
您的 "invalid 'tz' value" 错误的来源是因为,无论出于何种原因,R 不接受 tz = df$var
。如果您设置 tz = 'America/New_York'
或其他一些字符值,那么它将起作用。
根据位置将 UTC 时间转换为不同时区的更好答案(而不是使用下面的 force_tz)。它也比循环或使用嵌套的 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