R преобразование дат POSIXct с помощью тегов BST / GMT с использованием as.Date () - PullRequest
3 голосов
/ 09 января 2012

Мне нужно использовать as.Date для индекса объекта зоопарка. Некоторые даты указаны в BST, поэтому при конвертации я теряю день только на этих записях. Меня не волнует разница в один час или даже временная часть даты, я просто хочу убедиться, что отображаемые даты остаются прежними. Я предполагаю, что это не очень сложно, но я не могу справиться с этим. Может кто-нибудь помочь, пожалуйста?

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"

Минимально воспроизводимый пример (не требуется zoo упаковка):

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"

Ответы [ 2 ]

4 голосов
/ 09 января 2012

Предположим, у нас есть этот пример данных:

library(zoo)
x <- as.POSIXct("2000-01-01", tz = "GMT")

Затем посмотрите, что вы хотите:

# use current time zone
as.Date(as.character(x, tz = ""))

# use GMT
as.Date(as.character(x, tz = "GMT"))

# set entire session to GMT
Sys.setenv(TZ = "GMT")
as.Date(x)

Также попробуйте "BST" вместо "GMT"и обратите внимание на статью о дате и времени в R News 4/1 .

3 голосов
/ 09 января 2012

Вы можете сместить объекты POSIX, чтобы они не основывались около полуночи. 1 часа (3600 секунд) должно быть достаточно:

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