gpt4 book ai didi

r - 计算R中日期范围内的天数

转载 作者:行者123 更新时间:2023-12-04 22:54:45 25 4
gpt4 key购买 nike

我需要帮助计算给定日期范围内的天数。
这是我的数据集:

dat<- data.frame(a=c(seq(as.Date("2018-01-01"), as.Date("2018-01-3"), 1),
seq(as.Date("2018-01-08"), as.Date("2018-01-10"), 1),
seq(as.Date("2018-01-23"), as.Date("2018-01-31"), 1),
seq(as.Date("2018-03-01"), as.Date("2018-03-05"), 1)),
b= c(rep("x",5), rep("y",5), rep("x",5), rep("y",5)) )



a b
1 2018-01-01 x
2 2018-01-02 x
3 2018-01-03 x
4 2018-01-08 x
5 2018-01-09 x
6 2018-01-10 y
7 2018-01-23 y
8 2018-01-24 y
9 2018-01-25 y
10 2018-01-26 y
11 2018-01-27 x
12 2018-01-28 x
13 2018-01-29 x
14 2018-01-30 x
15 2018-01-31 x
16 2018-03-01 y
17 2018-03-02 y
18 2018-03-03 y
19 2018-03-04 y
20 2018-03-05 y

这是从船上收到的报告,“x”和“y”是不同类型的燃料。 1 月 1 日和 0 月 3 日,船舶报告它正在使用“x”型燃料。然后ship在1月4日、5日、6日和7日没有任何报告。 Ship在8日(这是1月4日、5日、6日、7日和8日的合并)再次发送报告说它仍在使用燃料输入“x”。如果船舶将其燃料类型更改为“y”,它将发出报告。

我想计算燃料类型为“x”的天数和燃料类型为“y”的天数。如果日期之间存在差距,例如
1  2018-01-01 x
2 2018-01-02 x
3 2018-01-03 x
4 2018-01-08 x
5 2018-01-09 x

那么第 1 行和第 5 行之间的天数应为 8 天(09/Jan -01/Jan)。所以“x”的计数是 8 天
然后它应该计算 b 列中的下一个计数器,即“y”。
6  2018-01-10 y
7 2018-01-23 y
8 2018-01-24 y
9 2018-01-25 y
10 2018-01-26 y

这里的天数差异是 16 天(26/Jan-10-Jan)。所以“y”的计数是 16 天。

然后我们有“x”:
11 2018-01-27 x
12 2018-01-28 x
13 2018-01-29 x
14 2018-01-30 x
15 2018-01-31 x

此处,“x”的计数为 4 天(31/Jan-27/Jan)。所以“x”的总数是 (8+4)= 12 天。我们类似地计算“y”。
16 2018-03-01 y
17 2018-03-02 y
18 2018-03-03 y
19 2018-03-04 y
20 2018-03-05 y

这是问题所在。 Ship在二月份没有报告任何事情。由于上次报告的燃料类型使用是“x”,这是在 1 月 31 日报告的,这意味着整个 2 月,船舶都在使用燃料类型“x”,因此我们需要将 2 月的 28 天添加到“x”,这使得它(8+4+28)= 40 天

“y”计数是 (16+4)=21 天

我似乎无法理解如何编码逻辑。
任何帮助,将不胜感激。

最佳答案

data.table方法

library(data.table)
#create sample data
dt1 <- setDT(dat)
#create a data.table with one row for each day within the range of dt1
dt2 <- data.table( a = seq( min( dt1$a ), max( dt1$a), by = "days") )

#perform rolling join to get the last 'b' from dt1 on all dates in dt2
dt2[, b := dt1[dt2, b, on = "a", roll = TRUE]][]
#summarise by b (number of rows = number of days, so we can use .N)
dt2[, (days = .N), by = "b"]
# b N
# 1: x 42
# 2: y 22

关于r - 计算R中日期范围内的天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55051593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com