R - 日期序列具有不同的长度,具体取决于使用的格式

时间:2018-05-17 15:06:33

标签: r date datetime seq

提前感谢您的时间。

我在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 :(得分:3)

您的第一种方法假定它一直是24小时,但情况并非总是如此。例如,在美国,因为夏令时。

让我们尝试使用两个日期,即2015年3月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个小时。现已更正。