【问题标题】:R - Sequence of dates has different length depending on format usedR - 日期序列具有不同的长度,具体取决于使用的格式
【发布时间】:2018-05-17 15:06:32
【问题描述】:

提前感谢您的宝贵时间。

我在 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。

为什么这些向量的长度相差 1?就像在某个地方多出了一个小时。

奇怪的是,如果我选择一个更接近开始日期的结束日期,例如:

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

那么这两个向量的长度相同(175392)

有人知道这种奇怪行为的原因吗?

再次感谢!

【问题讨论】:

    标签: r date datetime seq


    【解决方案1】:

    您的第一种方法假定它始终是一天 24 小时,但情况并非总是如此。例如,在美国,由于夏令时。


    让我们在 3 月 8 日 2015 年美国夏令时的前一天和后一天(如果您的区域设置为美国)尝试使用您的方法。

    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 小时。现已更正。

    【讨论】:

      猜你喜欢
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多