R 如何基于现有日期创建一系列年-周字符串值?

R 如何基于现有日期创建一系列年-周字符串值?,r,sequence,R,Sequence,我正在绘制从2018年到2019年的周线图,X轴上的刻度线代表年份和周 例如: 2018-50, 2018-51, 2018-52, 2018-53, 2019-01, 2019-02, 2019-03 我有两个数据帧,其中的日期并不总是相同的。因此,我认为可能有效的一个解决方案是在任一数据帧中找到最低的yearWeek值,在任一数据帧中找到最大的yearWeek值,然后使用这两个值创建一个序列。请注意,这两个值可以存在于单个数据帧内,或者一个数据帧可以具有最低/最早的值,而另一个具有最高/最

我正在绘制从2018年到2019年的周线图,X轴上的刻度线代表年份和周

例如:

2018-50, 2018-51, 2018-52, 2018-53, 2019-01, 2019-02, 2019-03
我有两个数据帧,其中的日期并不总是相同的。因此,我认为可能有效的一个解决方案是在任一数据帧中找到最低的
yearWeek
值,在任一数据帧中找到最大的
yearWeek
值,然后使用这两个值创建一个序列。请注意,这两个值可以存在于单个数据帧内,或者一个数据帧可以具有最低/最早的值,而另一个具有最高/最晚的值

两个数据帧如下所示:

  week yearWeek      month  day       date
1   31  2018-31 2018-08-01  Wed 2018-08-01
2   31  2018-31 2018-08-01  Thu 2018-08-02
3   31  2018-31 2018-08-01  Fri 2018-08-03
4   31  2018-31 2018-08-01  Sat 2018-08-04
5   32  2018-32 2018-08-01  Sun 2018-08-05
6   32  2018-32 2018-08-01  Mon 2018-08-06
我已经找到了一个解决办法,而且已经快到了,但还没有完全解决

此解决方案的问题是:

  • 单数周编号前面没有
    0
    ;及
  • 例如,尽管指定了
    seq(31:53)
    ,但输出从
    1开始(我知道为什么会发生这种情况);及
  • 似乎没有办法用这种方法在
    53
    停止计数(2018年有(短的)第53周,我想包括在内)并从
    2019-01开始恢复计数
我希望能够将X轴范围从
2018-31
(2018年第31周)设置为
2019-13
(2019年第13周)

大概是这样的:

  week yearWeek      month  day       date
1   31  2018-31 2018-08-01  Wed 2018-08-01
2   31  2018-31 2018-08-01  Thu 2018-08-02
3   31  2018-31 2018-08-01  Fri 2018-08-03
4   31  2018-31 2018-08-01  Sat 2018-08-04
5   32  2018-32 2018-08-01  Sun 2018-08-05
6   32  2018-32 2018-08-01  Mon 2018-08-06


简言之,我如何创建从最小日期值到最大日期值(在本例中为
2018-31
-
2019-13
)的一系列年-周值?

我想这对您很有用

x1 <- c(31:53)
x2 <- sprintf("%02d", c(1:13))
paste(c(rep(2018, length(x1)), rep(2019, length(x2))), c(x1, x2), sep = "-")

# [1] "2018-31" "2018-32" "2018-33" "2018-34" "2018-35" "2018-36" "2018-37" 
#     "2018-38" "2018-39" "2018-40" "2018-41" "2018-42" "2018-43" "2018-44" 
#     "2018-45" "2018-46" "2018-47" "2018-48" "2018-49" "2018-50" "2018-51" 
#     "2018-52" "2018-53" "2019-01" "2019-02" "2019-03" "2019-04" "2019-05" 
# "2019-06" "2019-07" "2019-08" "2019-09" "2019-10" "2019-11" "2019-12" "2019-13"

x1定义两个序列,然后限制到所需的范围:

years <- c("2018", "2019")
months <- sprintf("%02d", c(1:52))

result <- apply(expand.grid(years, months), 1, function(x) paste(x,collapse="-"))
result <- result[result >= "2018-31" & result <= "2019-13"]
result

 [1] "2019-01" "2019-02" "2019-03" "2019-04" "2019-05" "2019-06" "2019-07"
 [8] "2019-08" "2019-09" "2019-10" "2019-11" "2019-12" "2019-13" "2018-31"
[15] "2018-32" "2018-33" "2018-34" "2018-35" "2018-36" "2018-37" "2018-38"
[22] "2018-39" "2018-40" "2018-41" "2018-42" "2018-43" "2018-44" "2018-45"
[29] "2018-46" "2018-47" "2018-48" "2018-49" "2018-50" "2018-51" "2018-52"

years这里可以使用
stringr
软件包中的
stru pad
功能:

weeks <- str_pad(41:65 %% 53 + 1, 2, "left", "0")
years <- ifelse(41:65 <= 52, "2018", "2019")
paste(years, weeks, sep = "-")
     [1] "2018-42" "2018-43" "2018-44" "2018-45" "2018-46" "2018-47" "2018-48" "2018-49" "2018-50" "2018-51" "2018-52" "2018-53" "2019-01" "2019-02" "2019-03" "2019-04" "2019-05" "2019-06" "2019-07" "2019-08" "2019-09"
[22] "2019-10" "2019-11" "2019-12" "2019-13"

以下是使用strftime的可能性:

weeks <- seq(from = ISOdate(2018,12,10), to = ISOdate(2019,4,1), by="week")
strftime(weeks,format="%Y-%W") 

weeks编辑的部分很重要,您应该在问题的前面包含它。你能发布你的数据帧的
头吗?它看起来怎么样?如果两个数据帧相似,您可以包括其中任何一个。修改了问题并添加了数据帧的标题(它们共享相同的格式/相同)。您确定日期介于2018年和2019年之间吗?或者也需要从数据帧中确定哪些数据?目前,日期跨度为2018年至2019年;但是,将来传递到我正在构建的脚本中的数据集自然会有不同的日期范围,这意味着每次都需要确定日期才能正常工作。谢谢,这看起来不错,不过我已经用一些可能有用的信息更新了我的问题。日期范围必须跨越两个数据帧中的最小和最大日期(两者是否存在于同一数据帧中并不重要。因此,需要先检查)。“我该怎么做?”MusTheDataGuy更新了答案。看看是否有帮助。这几乎是完美的!它工作得很好,但是有一个输出值值得我关注:
2019-00
。有什么想法可以解释为什么会这样和/或如何纠正吗?我尝试过改变日期范围,似乎有些年份以
20XX-00
@musthedata开始,这就是R识别周的方式。检查
格式(截止日期(“2019-01-01”),%Y-%W”)
格式(截止日期(“2018-12-31”),%Y-%W”)
。R分别将其识别为第0周和第53周。如果要将其作为第1周,则需要识别这些0并将1添加到该年的每周编号中。请记住,R识别了三种不同的对一年中的周进行编号的约定,其中两种约定包括第0周(
%U
%W
),另一种约定不包括(
%V
)。请参见
?strtime
。我知道您在这里做了什么,但我也需要说明每年的部分周数(第53周),如果相关的话。(另外,您的
result
输出似乎没有说明具体的几周时间-我怀疑
result=“2018-31”&result我不理解您的评论,我的回答实际上生成了从2018-31年到2019-13年(含)的全年周。如果您有其他要求,那么您应该在一开始就说明。如果您仔细看,您会发现我已经说明了我的要求-我特别提到了53r第三个要点中的d周,从一开始就存在(
(2018年是(短的)第53周,我想包括在内)
).我现在发现,我误读了输出,因为列出的周数介于
2018-31
2019-13
之间。您的代码确实在2018年和2019年生成了52个单独的周数-我不反对这一点-但我要求的是第53周(如适用);您发布的输出没有列出,2018年结束于
2018-52
。你在这里打开了一罐蠕虫。当然,大多数年份实际上有53周。但是,问题是,你需要定义如何计算你的年周数。每个工具/语言都以不同的方式处理这一问题。这一要求使你的问题变得非常复杂。这很可能是一罐蠕虫,我知道大多数年份都有这是第53周,不是整周,但这是我必须解释的。我一直在使用
data.table::week()
从当前的
日期
值中提取周-在您的答案中可以实现类似的功能吗?
weeks <- seq(from = ISOdate(2018,12,10), to = ISOdate(2019,4,1), by="week")
strftime(weeks,format="%Y-%W")