【发布时间】: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 点开始计算。
问题:
- 如何高效生成 ADJ_PICK_DATE 列(现在也是 慢)?
- 如何使用更短、更高效的代码将源数据提取到 POSIXct 中? (在我的 i7 第 7 代 CPU 上,每百万个数据点大约需要 10-15 秒)
- 为什么我需要为每对日期使用不同的公式来计算天数?
示例数据(日期在源(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. -
谢谢,我编辑以缩短查询并消除冗余代码示例。我想我需要包含提取代码,因为这可能是这个奇怪的“错误”的原因。如果我不知道它的来源,数据就无法缩放和重用。