2017-01-27 1 views
1

Я создаю временный ряд данных, который я буду использовать для объединения других данных временных рядов.Как поддерживать часовой пояс с помощью POSIX DateTime и избегать NA, введенных принуждением в R?

dates2010 <- seq(as.POSIXct("2010-06-15 00:00:00", tz = "GMT"), as.POSIXct("2010-09-15 23:00:00", tz = "GMT"), by="hour") # make string of DateTimes for summer 2010 
dates2011 <- seq(as.POSIXct("2011-06-15 00:00:00", tz = "GMT"), as.POSIXct("2011-09-15 23:00:00", tz = "GMT"), by="hour") # make string of DateTimes for summer 2011 
dates <- c(dates2010, dates2011)       # combine the dates from both years 
sites <- c("a", "b", "c")         # make string of all sites 
datereps <- rep(dates, length(sites))      # repeat the date string the same number of times as there are sites 
sitereps <- rep(sites, each = length(dates))    # repeat each site in the string the same number of times as there are dates 
n <- data.frame(DateTime = datereps, SiteName = sitereps) # merge two strings with all dates and all sites 
n <- n[order(n$SiteName, n$Date),]       # re-order based on site, then date 

Если я запускаю приведенный выше код 'dates2010' и 'dates2011' в формате GMT: dates2010[1] "2011-06-15 00:00:00 GMT". Но когда я создаю объект «даты» для некоторых переключателей формата Причины в EST: dates[1] «2010-06-14 19:00:00 EST»

Может быть, это что-то делать с классами POSIX?

class(dates2010) 
[1] "POSIXct" "POSIXt" 

Я попытался change the default time zone for R по Гринвичу, чтобы избежать проблем времени переключения зоны. Это приводит к ошибке совпадения NA при попытке упорядочить фрейм данных 'n' и объединить другие кадры данных в 'n'.

n <- n[order(n$SiteName, n$Date),] 
Warning message: 
In xtfrm.POSIXct(x) : NAs introduced by coercion 

Любые мысли о том, как я могу поддерживать часовые пояса постоянными и избегать ошибок принуждения NA? Спасибо!

+3

'DateTimeClasses': _Using' c' на объекты «POSIXlt» преобразует их в текущем часовом поясе, так и на объектах «POSIXct» капель какой-либо «tzone» атрибуты (даже если все они отмечены тем же часовой пояс). По-видимому, нет способа избежать этого, поэтому вам просто нужно сбросить атрибут после факта, как показано ниже. – alistaire

+0

Ваш метод работал @Rich Scriven, чтобы изменить часовой пояс «дат» на «GMT». 'date <- structure (c (date2010, date2011), tzone =" GMT ")'. Благодарю. – notacodr

+0

О, ничего себе. Спасибо за эту информацию @alistaire. – notacodr

ответ

4

c() Капли атрибутов. Поэтому, когда вы создали dates, часовой пояс был сброшен, и он автоматически дефолт к текущему языку. К счастью, вы можете использовать structure() и установить там часовой пояс.

dates <- structure(c(dates2010, dates2011), tzone = "GMT") 
head(dates) 
# [1] "2010-06-15 00:00:00 GMT" "2010-06-15 01:00:00 GMT" 
# [3] "2010-06-15 02:00:00 GMT" "2010-06-15 03:00:00 GMT" 
# [5] "2010-06-15 04:00:00 GMT" "2010-06-15 05:00:00 GMT" 

dates Если уже был создан, вы можете добавить/изменить атрибут tzone позже.

attr(dates, "tzone") <- "GMT"