Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

invalid 'tz' value, problems with time zone

Tags:

timezone

r

xts

I'm working with minute data of NASDAQ, it has the index "2015-07-13 12:05:00 EST". I adjusted the system time with Sys.setenv(TZ = 'EST').

I want to program a simple buy/hold/sell strategy, therefore I create a vector of flat positions as a foundation.

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

Then I want to apply a constraint, that in a certain time window, positions are bound to be flat, which in my case means equal to 1.

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

And this returns the error:

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

I also get this error doing other calculations, I just used this example because it is easy and shows the problem.

As extra information:

> 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>

I don't understand the problem with the tz value... Any ideas?

like image 557
dracthamac Avatar asked Oct 15 '25 03:10

dracthamac


1 Answers

The source of your "invalid 'tz' value" error is because, for whatever reason, R doesn't accept tz = df$var. If you set tz = 'America/New_York' or some other character value, then it will work.

Better answer (instead of using force_tz below) for converting UTC times to various timezones based on location. It is also simpler and better than looping through or using a nested ifelse. I subset and change tz based on a timezone column (which my data already has, if not you can create it). Just make sure you account for all timezones in your data

(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']

Previous solution: 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
like image 197
Sam Avatar answered Oct 17 '25 16:10

Sam



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!