【问题标题】:Merge date and time, find the time difference in R合并日期和时间,在R中求时差
【发布时间】:2022-01-21 06:05:21
【问题描述】:

我有一个数据集,并且有一些日期和时间属性。这是示例,然后我将解释我要做什么;

date1 hour1 date2 hour2 date3 hour3
2014-03-16 00:00:00 16:20:00 2014-03-16 00:00:00 20:20:03 2014-03-16 00:00:00 22:12:34
2014-04-22 00:00:00 10:20:00 2014-04-22 00:00:00 15:20:03 2014-04-22 00:00:00 20:12:34
2015-03-12 00:00:00 16:20:00 2015-03-12 00:00:00 20:20:03 2015-03-12 00:00:00 22:12:34

我们知道 event1 在 event2 之前发生(event1 -> event2 -> event3)

但是如您所见,在日期属性中,时间部分不正确,但我们每个都有小时属性。我想做的事;我想通过使用小时属性来更正它们,然后找到这两个日期之间的差异并创建以小时为时间差的新属性。

上表示例;

event2_time
4
5
4

我试图合并小时到日期并创建一个这样的新属性,但它不起作用。(我的目标实际上是更正日期值并摆脱小时属性)

trainTable <- trainTable %>%
   mutate("newParam" = as.POSIXct(paste(alert_date, alert_hour), format="%Y-%m-%d %H:%M:%S")

我需要一些帮助,在此先感谢。

数据

structure(list(alert_date = structure(c(1394928000, 1395014400, 
1395014400, 1395187200, 1395273600, 1395014400), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), alert_hour = c("16:15:00", "20:53:00", "12:55:00", 
"14:22:00", "12:07:00", "17:48:00"), firstInterv_date = structure(c(1394928000, 
1395014400, 1395014400, 1395187200, 1395273600, 1395014400), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), firstInterv_hour = c("16:35:00", "21:05:00", "13:10:00", 
"14:42:00", "12:07:00", "18:08:00"), extinction_date = structure(c(1394928000, 
1395014400, 1395014400, 1395187200, 1395273600, 1395014400), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), extinction_hour = c("17:47:00", "22:46:00", "15:30:00", 
"15:25:00", "13:14:00", "21:10:00")), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

【问题讨论】:

  • 我还尝试创建一个函数,它将日期和小时作为参数并更改日期的小时部分并返回日期。但我无法创建正确的语法

标签: r datetime


【解决方案1】:

使用mapply 尝试此解决方案。它使用strsplit 将日期与小时分开。

dat <- as.data.frame( dat ) # tibbles are cool but sometimes very restrictive, so changing to data.frame here

dat_new <- data.frame( setNames( mapply( function(x,y){
  tmp <- sapply( strsplit( as.character(dat[,x]), " "), function(z) z[1] );
  list( as.POSIXct( paste(tmp,dat[,y] ) ) ) },
  grep("date", colnames(dat)), grep("hour", colnames(dat)) ), 
  c("a","b","c") ) )

dat_new$b - dat_new$a
Time differences in secs
[1] 1200  720  900 1200    0 1200

# if you need tibbles convert back if you need
as_tibble( dat_new )
# A tibble: 6 x 3
  a                   b                   c                  
  <dttm>              <dttm>              <dttm>             
1 2014-03-16 16:15:00 2014-03-16 16:35:00 2014-03-16 17:47:00
2 2014-03-17 20:53:00 2014-03-17 21:05:00 2014-03-17 22:46:00
3 2014-03-17 12:55:00 2014-03-17 13:10:00 2014-03-17 15:30:00
4 2014-03-19 14:22:00 2014-03-19 14:42:00 2014-03-19 15:25:00
5 2014-03-20 12:07:00 2014-03-20 12:07:00 2014-03-20 13:14:00
6 2014-03-17 17:48:00 2014-03-17 18:08:00 2014-03-17 21:10:00

数据

dat <- structure(list(alert_date = structure(c(1394928000, 1395014400, 
1395014400, 1395187200, 1395273600, 1395014400), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), alert_hour = c("16:15:00", "20:53:00", "12:55:00", 
"14:22:00", "12:07:00", "17:48:00"), firstInterv_date = structure(c(1394928000, 
1395014400, 1395014400, 1395187200, 1395273600, 1395014400), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), firstInterv_hour = c("16:35:00", "21:05:00", "13:10:00", 
"14:42:00", "12:07:00", "18:08:00"), extinction_date = structure(c(1394928000, 
1395014400, 1395014400, 1395187200, 1395273600, 1395014400), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), extinction_hour = c("17:47:00", "22:46:00", "15:30:00", 
"15:25:00", "13:14:00", "21:10:00")), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

【讨论】:

  • 我仍然不知道如何更正日期属性的时间部分,但无论如何我都会摆脱它们,是的,这可以解决问题。感谢您的回答和帮助:)
  • @Flardryn dat_new 数据框具有正确的 POSIXct 日期时间对象。你想去掉时间或日期部分吗?
  • 是的,你是对的,现在我还在考虑合并和操作部分。我将删除日期。顺便说一句,它适用于您的数据,但是当我尝试应用我的数据集时,出现错误。 strsplit(firstSix[, x], " ") : non-character argument我检查了我的约会课程,一切似乎都很好:/ @Andre Wildberg
  • @Fladryn 那是因为在我的数据集中它们只是字符而不是时间对象。您可以通过在 strsplit 中执行 as.character(dat[,x]) 或在您的情况下使用 as.character(firstSix[, x]) 来解决此问题。
  • 是的,现在我有了。抱歉,它来来去去,下次我需要更多关于我的帖子的详细信息。非常感谢您的时间和帮助! @Andre Wildberg
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 2018-04-12
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多