Search code examples
rdatextsbinary-search-treeposixct

R converting POSIXct dates with BST/GMT tags using as.Date()


I need to use as.Date on the index of a zoo object. Some of the dates are in BST and so when converting I lose a day on (only) these entries. I don't care about one hour's difference or even the time part of the date at all, I just want to make sure that the dates displayed stay the same. I'm guessing this is not very hard but I can't manage it. Can somebody help please?

class(xtsRet)
#[1] "xts" "zoo"

index(xtsRet)
#[1] "2007-07-31 BST" "2007-08-31 BST" "2007-09-30 BST" "2007-10-31 GMT"

class(index(xtsRet))
#[1] "POSIXt"  "POSIXct"

index(xtsRet) <- as.Date(index(xtsRet))

index(xtsRet)
#[1] "2007-07-30" "2007-08-30" "2007-09-29" "2007-10-31"

Minimally reproducible example (not requiring zoo package):

my_date <- as.POSIXct("2007-04-01") # Users in non-UK timezone will need to
                                    # do as.POSIXct("2007-04-01", "Europe/London")
my_date
#[1] "2017-04-01 BST"

as.Date(my_date)
#[1] "2017-03-31"

Solution

  • You can offset the POSIX objects so its not based around midnight. 1 hour (3600 secs) should be sufficient:

    d <- as.POSIXct(c("2007-07-31","2007-08-31","2007-09-30","2007-10-31"))
    d
    [1] "2007-07-31 BST" "2007-08-31 BST" "2007-09-30 BST" "2007-10-31 GMT"
    
    as.Date(d)
    [1] "2007-07-30" "2007-08-30" "2007-09-29" "2007-10-31"
    as.Date(d+3600)
    [1] "2007-07-31" "2007-08-31" "2007-09-30" "2007-10-31"