计算POSIXct列的日期差异(BUG?)

时间:2017-07-28 06:34:11

标签: r date posixct simplify

我正在使用此代码从两个POSIXct日期获得数小时的差异。

x <- transform(x, HRS = ceiling(as.numeric(SHIP_DATE-PICK_DATE)))

这可以得到准确的结果。但是,当我试图找到另一个类似列的小时差异时,我需要这样做:

x <- transform(x, HRS_ADJ = ceiling(as.numeric(SHIP_DATE-ADJ_PICK_DATE)/60))

PICK_DATE&amp; SHIP_DATE使用相同的公式提取。

x$SHIP_DATE <- ifelse(is.na(as.POSIXct(x$SHIP_DATE, format="%d-%b-%Y %H:%M %p")),
                      yes = as.POSIXct(x$SHIP_DATE, format="%d-%b-%Y %H:%M"),
                      no = as.POSIXct(x$SHIP_DATE, format="%d-%b-%Y %H:%M %p"))
x$SHIP_DATE <- as.POSIXct(x$SHIP_DATE, origin = "1970-01-01")

ADJ_PICK_DATE的计算方法如下:

x$ADJ_PICK_DATE <- ifelse(x$PICK_TIME=="EARLY",
                          as.POSIXct(paste(format(x$PICK_DATE, "%d-%b-%Y"), "03:00"),
                                     format="%d-%b-%Y %H:%M"), x$PICK_DATE)
x$ADJ_PICK_DATE <- ifelse(x$PICK_TIME=="LATE",
                          as.POSIXct(paste(format(x$PICK_DATE+86400, "%d-%b-%Y"),
                                           "03:00"), format="%d-%b-%Y %H:%M"),
                          x$ADJ_PICK_DATE)
x$ADJ_PICK_DATE <- as.POSIXct(x$ADJ_PICK_DATE, origin = "1970-01-01")
  

计算PICK_TIME以调整PICK_DATE,对于16:00之间的任何订单   &安培; 03:00,提前期从凌晨3点开始计算。

问题:

  1. 如何有效地生成ADJ_PICK_DATE列(现在也是如此) 慢)?
  2. 如何使用更短更有效的代码将源数据提取到POSIXct? (我的i7第7代CPU每百万个数据点大约需要10-15秒)
  3. 为什么我需要为每对日期使用不同的公式来计算天数?
  4. 样本数据(日期在源(PICK_DATE&amp; SHIP_DATE)中随机格式化为“DD-MMM-YYYY HH:mm”和“DD-MMM-YYYY hh:mm AM / PM”):

    PICK_DATE    SHIP_DATE    PICK_TIME  
    01-APR-2017 00:51    02-APR-2017 06:55    EARLY  
    01-APR-2017 00:51    02-APR-2017 12:11 PM    EARLY  
    01-APR-2017 07:51    02-APR-2017 12:11 PM    OKAY  
    01-APR-2017 02:51 PM    02-APR-2017 09:39 AM    LATE  
    

1 个答案:

答案 0 :(得分:0)

好的,我现在得到了一些解决方案。

  1. 使用lubridate包,此方法需要大约50%的处理时间:
  2. x$ADJ_PICK_DATE <- ifelse(x$PICK_TIME=="EARLY",
                                      dmy_hm(paste(format(x$PICK_DATE, "%d-%b-%Y"), "03:00")),
                                      ifelse(x$PICK_TIME=="LATE",
                                             dmy_hm(paste(format(x$PICK_DATE+86400, "%d-%b-%Y"),
                                                          "03:00")), x$PICK_DATE))
            x$ADJ_PICK_DATE <- as.POSIXct(x$ADJ_PICK_DATE, origin = "1970-01-01")
    
    1. 再次使用lubridate
    2. x$SHIP_DATE <- lubridate::dmy_hm(x$SHIP_DATE)
      x$PICK_DATE <- lubridate::dmy_hm(x$PICK_DATE)
      
      1. 执行转换时可能存在一些格式错误。我仍然需要帮助解决这个问题。