R - последовательность дат имеет разную длину в зависимости от используемого формата - PullRequest
0 голосов
/ 17 мая 2018

Заранее спасибо за ваше время.

Я генерирую последовательность часовых значений от одной даты к другой в R. Это две даты:

    first_date_year_start <- as.Date("1995-1-1")
    date_end <- as.Date("2015-10-31")

Тогда яиспользовать два разных метода для генерации последовательности.Первый - преобразование даты в числовое с использованием шагов 1/24 (1 час):

    julDays_1hstep_simulation_period <- seq(from = 1, to = 23/24 + as.numeric(date_end-first_date_year_start) + 1, by = 1/24 )

Длина этого вектора равна 182616.

Второй подход заключается в измененииформат даты к одному со временем, а затем сгенерируйте последовательность:

    first_date_year_start_with_time <- strptime (paste0(as.character(first_date_year_start), " 00:00") ,format = "%Y-%m-%d %H:%M") 
    date_end_with_time <- strptime (paste0(as.character(date_end), " 23:00") ,format = "%Y-%m-%d %H:%M") 

    dates_with_times_simulation_period <- seq(from =first_date_year_start_with_time , to = date_end_with_time , by = "hour")

Длина этого вектора равна 182615.

Почему длины этих векторов отличаются на один?Это как если бы где-то был дополнительный час.

Странно то, что если я выберу дату окончания ближе к дате начала, например:

    date_end <- as.Date("2015-1-3")

, тогда два векторатой же длины (175392)

Кто-нибудь знает причину этого странного поведения?

Еще раз спасибо!

1 Ответ

0 голосов
/ 17 мая 2018

Ваш первый метод предполагает, что это всегда 24 часа в сутки, что не всегда так. Например, в Соединенных Штатах из-за перехода на летнее время.


Давайте опробуем ваши методы с двумя датами, за день до и на следующий день после перехода на летнее время в США 2015 года 8 марта (если для вашего языка установлено значение США).

start <- as.Date("1995-1-1")
end_bef <- as.Date("2015-3-7")
end_aft <- as.Date("2015-3-9")

Два метода:

# Assumes 24 hours each day
method_1 <- function(start, end) {
  out <- seq(
    from = 1,
    to = 23/24 + as.numeric(end - start) + 1,
    by = 1/24
  )
  length(out)
}

# Lets `seq()` date method worry about daylight savings time, etc,
# based on locale
method_2 <- function(start, end) {

  start <- strptime(
    paste0(as.character(start), " 00:00"),
    format = "%Y-%m-%d %H:%M"
  )
  end <- strptime(
    paste0(as.character(end), " 23:00"),
    format = "%Y-%m-%d %H:%M"
  )

  length(seq(start, end, "hour"))
}

Давайте попробуем:

method_1(start, end_bef) == method_2(start, end_bef)
#> [1] TRUE

method_1(start, end_aft) == method_2(start, end_aft)
#> [1] FALSE

Редактировать

Ваш оригинальный второй метод был верным, в моей первой версии я насчитал 25 часов в последний день. Исправлено сейчас.

...