R:如何将日期+时间转换为数值

时间:2017-05-04 23:51:02

标签: r date

每个日期如下:

$product =\DB::table('order_details')
        ->where('order_id',$order_id)
        ->where('order_product_id',$product_id)
        ->first();
    if(!$product) {
        return response()->json(['status' => 0]);
    }
    return response()->json(['status' => $product]);

其中第一部分只是日期,第二部分是一天中的时间,这也可能等于以下任何一种:下午,中午,午夜。

我想将每个这样的日期转换为数字。

首先,我们会得到一个基准日期,例如

"dd/mm/yy Morning"

然后,对于每个日期,我想计算此日期和基准日期之间的天数。此外,如果我们的日期具有“晨”标签,那么我们只需将整数值存储为我们的数值。但是,如果日期具有“中午”标记,那么我们将数字加1/4。如果是下午,我们加2/4,如果是午夜,我们加3/4。

所以,例如,日期

"05/05/05 Morning".

应转换为1.75,

"06/05/05 Midnight", 

应该只是10。

知道如何在R中执行此操作?

1 个答案:

答案 0 :(得分:3)

使用stringr和lubridate包,此函数采用指定格式的字符串“dd / mm / yy TimeOfDay”并返回日期时间对象(其中Morning = 6am,Noon = 12pm,Afternoon = 6pm,Midnight =上午12点。

library(stringr)
library(lubridate)

unpack <- function(s, tod_levels = c("Morning", "Noon", "Afternoon", "Midnight")) {
  s <- str_split(s, " ")[[1]]
  s_hr  <- as.integer(factor(s[2], levels = tod_levels)) * 6 * 60 * 60
  as_datetime(dmy(s[1])) + s_hr
}

使用此方法准备基线并与新时间进行比较的示例:

baseline <- unpack("05/05/05 Morning")

unpack("06/05/05 Midnight") - baseline
#> Time difference of 1.75 days

as.numeric(unpack("06/05/05 Midnight") - baseline)
#> [1] 1.75

as.numeric(unpack("15/05/05 Morning") - baseline)
#> [1] 10