有没有办法在 R 中获取时差(日期戳不一致)?
Is there a way to take the time difference in R (with inconsistent datestamp)?
我想知道是否有人知道如何解决这个问题。
我有一个包含以下列的数据框:Startime、Endtime 和 ID(下面的数据框)我已经对 ID 进行了分组。我试图找出特定“分组依据”ID(特别是 A)的时差(以秒为单位)
Starttime Endtime ID
12/18/2019 4:06:59 PM 12/18/2019 4:07:05 PM A
12/18/2019 4:07:26 PM 12/18/2019 4:07:28 PM A
12/17/2019 6:48:06 PM 12/17/2019 6:48:07 PM A
12/17/2019 6:25:16 PM 12/17/2019 6:25:22 PM A
我通过在 R 中使用以下代码并利用 dplyr 包来解决这个问题:
data <-rawdata %>% group_by(ID) %>%
summarize(diff = difftime(last(as.POSIXct(Endtime, format ="%m/%d/%Y %I:%M:%S %p")),
first(as.POSIXct(Starttime, format = "%m/%d/%Y %I:%M:%S %p" )), units = "secs"))
但是,上面的代码只计算开始时间和结束时间之间的差异,而不计算两者之间的差异。例如,上面的代码计算:
12/18/2019 4:06:59 PM and 12/17/2019 6:25:22 PM
我认为这是不准确的,因为它没有考虑 12/17 何时更改为 12/18,它只是采用分组 ID 中的第一个和最后一个值。
有没有办法在已经分组的数据中对数据进行分组? (进一步按时间分组:月日和年,然后以秒为单位计算差异?
有办法吗?进一步对数据进行分组,这样当日期发生变化时,它也会知道计算此差异,而不是只计算第一个和最后一个值。
Starttime Endtime ID
12/18/2019 4:06:59PM 12/18/2019 4:07:05 PM A
12/18/2019 4:07:26PM 12/18/2019 4:07:28 PM A
12/17/2019 6:48:06PM 12/17/2019 6:48:07PM A
12/17/2019 6:25:16PM 12/17/2019 6:25:22PM A
任何建议都会有所帮助!我觉得我被困在这上面了。我会继续研究。谢谢!
******编辑澄清******
我正在计算我的电子邮件持续时间。在这个例子中,我已经按 ID 分组了。
我想为 ID 'A' 计算我的电子邮件阅读持续时间。我目前使用的代码只是以秒为单位计算它的开始和结束时间。
data <-rawdata %>% group_by(ID) %>% summarize(diff = difftime(last(as.POSIXct(结束时间,格式=
"%m/%d/%Y %I:%M:%S %p")),first(as.POSIXct(开始时间, 格式 = "%m/%d/%Y %I:%M: %S %p" )), 单位 = "secs"))
不过,我认为这并不准确。总的来说,我想要每一行的时间差,以便更准确地计算我的电子邮件阅读总时间。输出将是:
Starttime Endtime
12/18/2019 4:06:59PM 12/18/2019 4:07:05 PM A 6 secs
12/18/2019 4:07:26PM 12/18/2019 4:07:28 PM A 1 secs
12/17/2019 6:48:06PM 12/17/2019 6:48:07PM A 1 sec
12/17/2019 6:25:16PM 12/17/2019 6:25:22PM A 6 secs
将 data.frame
拆分为 ID
,然后确定每个
的时间
#sample data saved to df1
list1 <- split(df1, df1$ID)
lapply(list1, function(x) difftime(head(x$Starttime, n = 1), tail(x$Endtime, n = 1), units = "sec"))
$A
Time difference of 78097 secs
如果您希望每一行都不同,那么您不想对每个 ID 进行汇总,而是在不分组的情况下进行变异并删除 first
和 last
函数调用。
因此,您的代码应如下所示:
data <- rawdata %>%
mutate(diff = difftime(as.POSIXct(Endtime, format = "%m/%d/%Y %I:%M:%S %p"),as.POSIXct(Starttime, format = "%m/%d/%Y %I:%M:%S %p" ), units = "secs"))
但是,当您使用日期时,您可能想要使用 lubridate
包,它比基础 R
:
更灵活
library(lubridate)
data <- rawdata %>%
mutate_at(vars(Endtime, Starttime), as.POSIXct, format = "%m/%d/%Y %I:%M:%S %p") %>%
mutate(diff = interval(Endtime, Starttime)/seconds(1))
然后,如果你想要总数,你可以按ID
分组并汇总总和:
data %>%
group_by(ID) %>%
summarize(total=sum(diff))
对于您的下一个问题,请尝试对您的数据使用 dput
函数来共享一个可重现的示例,正如我在评论中所述。如果 he/she 可以复制粘贴您的代码并 运行 它,这对帮助者来说会容易得多。
我想知道是否有人知道如何解决这个问题。 我有一个包含以下列的数据框:Startime、Endtime 和 ID(下面的数据框)我已经对 ID 进行了分组。我试图找出特定“分组依据”ID(特别是 A)的时差(以秒为单位)
Starttime Endtime ID
12/18/2019 4:06:59 PM 12/18/2019 4:07:05 PM A
12/18/2019 4:07:26 PM 12/18/2019 4:07:28 PM A
12/17/2019 6:48:06 PM 12/17/2019 6:48:07 PM A
12/17/2019 6:25:16 PM 12/17/2019 6:25:22 PM A
我通过在 R 中使用以下代码并利用 dplyr 包来解决这个问题:
data <-rawdata %>% group_by(ID) %>%
summarize(diff = difftime(last(as.POSIXct(Endtime, format ="%m/%d/%Y %I:%M:%S %p")),
first(as.POSIXct(Starttime, format = "%m/%d/%Y %I:%M:%S %p" )), units = "secs"))
但是,上面的代码只计算开始时间和结束时间之间的差异,而不计算两者之间的差异。例如,上面的代码计算:
12/18/2019 4:06:59 PM and 12/17/2019 6:25:22 PM
我认为这是不准确的,因为它没有考虑 12/17 何时更改为 12/18,它只是采用分组 ID 中的第一个和最后一个值。
有没有办法在已经分组的数据中对数据进行分组? (进一步按时间分组:月日和年,然后以秒为单位计算差异?
有办法吗?进一步对数据进行分组,这样当日期发生变化时,它也会知道计算此差异,而不是只计算第一个和最后一个值。
Starttime Endtime ID
12/18/2019 4:06:59PM 12/18/2019 4:07:05 PM A
12/18/2019 4:07:26PM 12/18/2019 4:07:28 PM A
12/17/2019 6:48:06PM 12/17/2019 6:48:07PM A
12/17/2019 6:25:16PM 12/17/2019 6:25:22PM A
任何建议都会有所帮助!我觉得我被困在这上面了。我会继续研究。谢谢!
******编辑澄清******
我正在计算我的电子邮件持续时间。在这个例子中,我已经按 ID 分组了。
我想为 ID 'A' 计算我的电子邮件阅读持续时间。我目前使用的代码只是以秒为单位计算它的开始和结束时间。
data <-rawdata %>% group_by(ID) %>% summarize(diff = difftime(last(as.POSIXct(结束时间,格式= "%m/%d/%Y %I:%M:%S %p")),first(as.POSIXct(开始时间, 格式 = "%m/%d/%Y %I:%M: %S %p" )), 单位 = "secs"))
不过,我认为这并不准确。总的来说,我想要每一行的时间差,以便更准确地计算我的电子邮件阅读总时间。输出将是:
Starttime Endtime
12/18/2019 4:06:59PM 12/18/2019 4:07:05 PM A 6 secs
12/18/2019 4:07:26PM 12/18/2019 4:07:28 PM A 1 secs
12/17/2019 6:48:06PM 12/17/2019 6:48:07PM A 1 sec
12/17/2019 6:25:16PM 12/17/2019 6:25:22PM A 6 secs
将 data.frame
拆分为 ID
,然后确定每个
#sample data saved to df1
list1 <- split(df1, df1$ID)
lapply(list1, function(x) difftime(head(x$Starttime, n = 1), tail(x$Endtime, n = 1), units = "sec"))
$A
Time difference of 78097 secs
如果您希望每一行都不同,那么您不想对每个 ID 进行汇总,而是在不分组的情况下进行变异并删除 first
和 last
函数调用。
因此,您的代码应如下所示:
data <- rawdata %>%
mutate(diff = difftime(as.POSIXct(Endtime, format = "%m/%d/%Y %I:%M:%S %p"),as.POSIXct(Starttime, format = "%m/%d/%Y %I:%M:%S %p" ), units = "secs"))
但是,当您使用日期时,您可能想要使用 lubridate
包,它比基础 R
:
library(lubridate)
data <- rawdata %>%
mutate_at(vars(Endtime, Starttime), as.POSIXct, format = "%m/%d/%Y %I:%M:%S %p") %>%
mutate(diff = interval(Endtime, Starttime)/seconds(1))
然后,如果你想要总数,你可以按ID
分组并汇总总和:
data %>%
group_by(ID) %>%
summarize(total=sum(diff))
对于您的下一个问题,请尝试对您的数据使用 dput
函数来共享一个可重现的示例,正如我在评论中所述。如果 he/she 可以复制粘贴您的代码并 运行 它,这对帮助者来说会容易得多。