【问题标题】:Finding date based on time根据时间查找日期
【发布时间】:2015-10-18 14:08:41
【问题描述】:

我正在考虑如何根据时间查找日期(表中不存在)。

例子:记住,我只有时间

time = c("9:44","15:30","23:48","00:30","05:30", "15:30", "22:00", "00:45")

我知道开始日期是 2014 年 8 月 28 日这一事实,但我如何获得午夜后更改的日期。

预期结果是

9:44   2014-08-28
15:30  2014-08-28
23:48  2014-08-28
00:30  2014-08-29
05:30  2014-08-29
15:30  2014-08-29
22:00  2014-08-29
00:45  2014-08-30

【问题讨论】:

标签: r date datetime dplyr lubridate


【解决方案1】:

这是一个使用 data.tableITime 类的示例,它使您能够操纵时间(在将 time 转换为此类后,您现在可以减去/添加分钟/小时/等)

library(data.table)
time <- as.ITime(time)
Date <- as.IDate("2014-08-28") + c(0, cumsum(diff(time) < 0))

data.table(time, Date)
#        time       Date
# 1: 09:44:00 2014-08-28
# 2: 15:30:00 2014-08-28
# 3: 23:48:00 2014-08-28
# 4: 00:30:00 2014-08-29
# 5: 05:30:00 2014-08-29
# 6: 15:30:00 2014-08-29
# 7: 22:00:00 2014-08-29
# 8: 00:45:00 2014-08-30

【讨论】:

  • 感谢@David Arenburg。会详细说明这部分代码的功能,即 c(0, cumsum(diff(time)
  • 它获取时间向量中的差异并检查它是否为负(这意味着日期已经改变),然后创建这些变化的累积和,以创建一个向量来分类每个观察到某一天。试着运行c(0, cumsum(diff(time) &lt; 0)) 看看你会得到什么。之后,我将此向量添加到 "2014-08-28" 以创建日期序列。如果您希望最终结果是单个日期字符串,只需执行 as.POSIXct(time, Date)as.POSIXct(paste(Date, time)) 而不是 data.table(time, Date)
【解决方案2】:

使用 chron 包,我们假设较晚的时间在同一天,较早的时间在第二天:

library(chron)
date <- as.Date("2014-08-28") + cumsum(c(0, diff(times(paste0(time, ":00"))) < 0))
data.frame(time, date)

给予:

   time       date
1  9:44 2014-08-28
2 15:30 2014-08-28
3 23:48 2014-08-28
4 00:30 2014-08-29
5 05:30 2014-08-29
6 15:30 2014-08-29
7 22:00 2014-08-29
8 00:45 2014-08-30

【讨论】:

    【解决方案3】:

    这是一种方法:

    time = c("9:44","15:30","23:48","00:30","05:30", "15:30", "22:00", "00:45")
    times <- sapply(strsplit(time, ":", TRUE), function(x) Reduce("+", as.numeric(x) * c(60, 1)))
    as.POSIXct("2014-08-28") + times + 60*60*24*cumsum(c(F, tail(times < lag(times), -1)))
    # [1] "2014-08-28 00:09:44 CEST" "2014-08-28 00:15:30 CEST" "2014-08-28 00:23:48 CEST" "2014-08-29 00:00:30 CEST" "2014-08-29 00:05:30 CEST" "2014-08-29 00:15:30 CEST" "2014-08-29 00:22:00 CEST" "2014-08-30 00:00:45 CEST"
    

    【讨论】:

    • 感谢@luke。我有点复杂,但很棒的东西
    【解决方案4】:

    您可以将系统日期与时间连接起来并获得结果。例如,在 Oracle 中,我们可以得到日期和时间:

    to_char(sysdate,'DD-MM-RRRR')|| ' ' || To_char(sysdate,'HH:MIAM')
    

    这将导致例如。 2015 年 12 月 9 日上午 9:50

    根据您的要求,将其用作:

     to_char(sysdate,'DD-MM-RRRR')|| ' 00:45' and so on.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 2020-05-19
      相关资源
      最近更新 更多