R posixct даты и время, не центрируясь в полночь - PullRequest
0 голосов
/ 12 сентября 2018

У меня даты и время хранятся в двух столбцах. Первый имеет дату как «20180831». Время сохраняется как количество секунд с полуночи; 3 утра будет храниться как 10 800.

Мне нужен объединенный столбец даты и времени, и мне трудно с чем-то простым.

Я могу получить даты без проблем, но lubridate "hms" интерпретирует поле времени как период, а не как "время" как таковое.

Я попытался преобразовать дату в формат posix.ct, а затем использовать ее в качестве источника для поля времени, но posix.ct не устанавливает время для полуночи, вместо этого оно устанавливает его на 1800 или 1900 часов в зависимости от даты , Мне нужно, чтобы он был установлен на полночь для всех рядов, я не хочу корректировать летнее время.

Вот код: Сначала я сделал функцию, потому что есть несколько полей даты и времени, для которых я должен сделать это.

mkdate<-function(x){
a<-as.Date(as.character(x),format='%Y%m%d')
a<-as.POSIXct(a)
return(a)
}

df$date<-mkdate(df$date) #applies date making function to date field 

df$datetime<-as.POSIXct(df$time,origin=df$date)

Я уверен, что это связано с часовыми поясами. Я нахожусь в центральном часовом поясе, и я экспериментировал с добавлением спецификации "tz" в эти команды как в функции mkdate, так и в временном коде, создающем столбец "datetime". Я пробовал:

tz="America/Chicago"
tz="CST"
tz="UTC"

Помощь будет высоко ценится!

Отредактировано на примере:

x<-c(20180831,20180710,20160511,20170105,20180101) #these are dates.

as.POSIXct(as.Date(as.character(x),format="%Y%m%d")) 

Выше код преобразует даты в секунды с 1 января 1970 года. Я мог бы преобразовать это в числовое значение и добавить свое значение «секунд» в это поле, НО это не правильно. Вот что я вижу вместо вывода:

[1] "2018-08-30 19:00:00 CDT" "2018-07-09 19:00:00 CDT" "2016-05-10 19:00:00 CDT" "2017-01-04 18:00:00 CST" "2017-12-31 18:00:00 CST"

Посмотрите на первое свидание - оно должно быть 8/31, но вместо этого - 8/30. Где-то там происходит корректировка часового пояса. Часы переводятся на 5 или 6 часов назад, потому что я в центральном времени Первая запись должна быть 2018-08-31 00:00:00. Затем я бы преобразовал его в числовое значение, добавил поле секунд и снова преобразовал его в формат POSIXct. Я попытался включить спецификацию tz повсюду без удачи.

Sys.getlocale("LC_TIME")

возвращает "English_United States.1252"

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Я считаю, что следующее делает то, что вы хотите.
Моя локаль следующая, поэтому результаты отличаются от ваших.

Sys.getlocale("LC_TIME")
#[1] "Portuguese_Portugal.1252"

Разница будет связана с переходом на летнее время,летний час.

Что касается вашей проблемы, все, что вам нужно сделать, это помнить, что объекты класса "POSIXct кодируются как количество секунд с начала координат, и этот источник обычно - полночь 1970-01-01.Таким образом, вы должны добавить свои секунды с полуночи к секундам as.Date.

x <- "20180831"

xd <- mkdate(x)
y <- 10800

as.POSIXct(as.integer(xd) + y, origin = "1970-01-01")
#[1] "2018-08-31 04:00:00 BST"

as.POSIXct(as.integer(xd) + y, origin = "1970-01-01", tz = "America/Chicago")
#[1] "2018-08-30 22:00:00 CDT"
0 голосов
/ 12 сентября 2018

Есть много способов сделать это:

mktime = function(a, b)modifyList(strptime(a, '%Y%m%d'), list(sec = as.numeric(gsub(',', '', b))))

 mktime("20180831",'10,800')
 [1] "2018-08-31 03:00:00 PDT"
mktime('20180301','10800')
[1] "2018-03-01 03:00:00 PST"
 mktime('20180321','10800')
[1] "2018-03-21 03:00:00 PDT"

Глядя на приведенный выше код, он не настраивается на летнее время.Независимо от даты, секунды по-прежнему показывают, что это 3 часа ночи, включая даты, когда ST -> DT.Это также будет учитывать ваш местный часовой пояс.

...