【问题标题】:Calculation of date difference (BUG?) for POSIXct columnsPOSIXct 列的日期差异 (BUG?) 计算
【发布时间】:2017-07-28 06:34:11
【问题描述】:

我正在使用此代码来获取两个 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 和 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. 为什么我需要为每对日期使用不同的公式来计算天数?

示例数据(日期在源(PICK_DATE 和 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  

【问题讨论】:

  • 与其共享大量运行在我们没有的数据上的代码,不如共享(使用dput())仅2 或3 行说明问题的数据。我认为您的问题可以简化为一个简短的段落,也许是 10 行代码 - 较短的问题更有可能获得良好的快速帮助。 See more tips here on making good reproducible examples in R.
  • 谢谢,我编辑以缩短查询并消除冗余代码示例。我想我需要包含提取代码,因为这可能是这个奇怪的“错误”的原因。如果我不知道它的来源,数据就无法缩放和重用。

标签: r date posixct simplify


【解决方案1】:

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

  1. 使用lubridate包,这个方法大约需要50%的处理时间:
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
x$SHIP_DATE <- lubridate::dmy_hm(x$SHIP_DATE)
x$PICK_DATE <- lubridate::dmy_hm(x$PICK_DATE)
  1. 进行转换时可能出现一些格式错误。在这个问题上我仍然需要帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多