Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算R中2个时间戳之间的秒数,周末除外_R_Timestamp_Difftime_Weekend - Fatal编程技术网

计算R中2个时间戳之间的秒数,周末除外

计算R中2个时间戳之间的秒数,周末除外,r,timestamp,difftime,weekend,R,Timestamp,Difftime,Weekend,如果我有一个包含两列的数据帧,这两列都是YMD HMS,那么如何计算这两列之间的秒差(周末除外) 第2列-第1列=以秒为单位的时间;需要排除周末秒数 Dates1 <- as.POSIXct("2011-01-30 12:00:00") + rep(0, 10) Dates2 <- as.POSIXct("2011-02-04") + seq(0, 9, 1) df <- data.frame(Dates1 = Dates1, Dates2 = Dates2) Dates1这

如果我有一个包含两列的数据帧,这两列都是YMD HMS,那么如何计算这两列之间的秒差(周末除外)

第2列-第1列=以秒为单位的时间;需要排除周末秒数

Dates1 <- as.POSIXct("2011-01-30 12:00:00") + rep(0, 10)
Dates2 <- as.POSIXct("2011-02-04") + seq(0, 9, 1)
df <- data.frame(Dates1 = Dates1, Dates2 = Dates2)

Dates1这里有一个对向量有效的切割:

没有周末的秒差 #' #“@param a,b POSIXt #“@param weekends”字符,一周中的某一天(请参见 #“[base::strtime()]对于“%w”参数,“0”是星期天,“6”是星期天 #"星期六,;默认为'c(“0”,“6”)`:周六和周日 #“@param units”字符,[base::units()]的合法值,例如 #“秒”、“分钟”、“小时” #“@return'difftime'对象 #@md
secs_no_weekend这里有一个使用
lubridate
和其他
tidyverse
软件包的解决方案。
lubridate
的好处在于,它可以非常无缝地处理大量随时间变化的奇怪问题,从时区到闰年,再到切换到夏时制。(如果您关心这些,请确保您的数据具有时区。)

我在这里使用的概念是中的
间隔
(使用
%--%%
操作符创建)。interval就是它听起来的样子:一个非常有用的类,基本上有一个start datetime和一个end datetime

我生成两个数据集:一个用于开始和结束时间,另一个用于周末开始和结束时间,每个数据集都有自己的间隔列。在weekend数据集中,请注意开始和结束时间被任意设置为一年的周六和周日。您应该使用对您有意义的值设置这些值,或者找到一种从数据中设置这些值的方法。:)

从这里,我们将使用lubridate的
intersect
函数找到您的时间间隔和周末时间间隔之间的重叠,因此稍后我们可以计算相关的周末秒数并将其减去

但首先,我们使用
tidyr
中的
crossing
来确保我们在
weekends
数据集中检查您的每一个间隔时间和每个周末。它只运行两个数据集的笛卡尔乘积(请参阅)

最后,我们使用
int_length
计算周末秒数,计算每个间隔的周末秒数,计算每个间隔的总秒数,并从总秒数中减去周末秒数。瞧!我们有总秒数,不包括周末

这个解决方案的另一个优点是它非常灵活。我把周末定义为周六0:00到周一0:00。。。但是你可以取消周五晚上,周一凌晨,任何你喜欢并且符合你分析要求的时间

库(dplyr)
图书馆(tidyr)
图书馆(tibble)
图书馆(lubridate)#使日期和时间更容易!
测试%
变异(
id=行号(),
timespan=开始时间%--%end\u时间
)
周末开始率%
变异(
总秒数=整数长度(时间跨度),
工作日秒=总秒-周末秒
)
一瞥(最终答案)

您能提供一些示例数据吗?这将使我们在提交答案之前更容易测试我们的答案是否符合要求您能否仅显示此答案所需的包?不是每个人都安装了所有的
tidyverse
,无论是根据政策还是偏好。我认为,在列出所需的包时,答案应该是明确的。(而且
tidyverse
已经导入了
lubridate
)我已经编辑了答案。不过,你的插入语是不正确的。运行
library(tidyverse)
不会附加
lubridate
。运行
install.packages(tidyverse)
会安装它(以及许多其他软件包),但是
library(tidyverse)
只附加核心软件包,而核心软件包(我承认很奇怪)不包括
lubridate
。看,啊,我现在明白了。。。我一直认为
tidyverse
是一个仅用于附加所有相关包的元包。。。现在我看到了的定义和使用。谢谢你的更正。稍微调整了一下代码,工作得很完美;只需将周数减去很多,而不是+(0:51),即可获得所有历史信息,然后将UTC日期转换为PST日期,然后运行函数并获得值!有没有办法让这更有效?当在完整数据集上使用此交叉时,我得到一个错误“errors cannot allocate vector of 3.1 GB”(在100个样本上完美地工作),有时这会在几分钟内给出,有时在几小时内给出-我们如何总是让它在几秒钟内显示出来?删除if-ndays=1会让一切都变得糟糕!在没有笛卡尔积的情况下速度非常快,只要日期2晚于日期1,那么如果有两个周末日期,它将显示为负数。简单的解决方法是将这些值重写为0。但是,如果D1是工作日,D2是周末,则它仍然计算总时间,而不是仅计算工作日,如果D1是周末,D2是工作日,则相同。有什么办法吗?得到它-在你的功能中只是特定的特定时区(即,AtART WOW,这是美丽的R2EvANS,我喜欢看到不同的方法来解决问题。OP,我会考虑我自己的问题来优化我的解决方案。)