R语言 如何使用zoo将年和季度列转换为日期?

ivqmmu1c  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(175)

我正在尝试将一个数据框列转换为日期格式。我正在使用zoo包,但是无法使其工作。所需的输出是yyyy-mm-dd,因此每年4个日期。
这是我目前所尝试的:

library(dplyr)
library(zoo)

as.yearqtr(1930, Q2)
as.yearqtr(1930, Q2, format = "%Y %Q%q")

为了澄清。使用以下代码

as.yearqtr(1930, Q2, format = "%Y %Q%q") %>% as.Date()

输出为

[1] "1930-01-01"

当然,这是第一季度,但它应该给出"1930 - 03 - 01",即第二季度。

cygmwpex

cygmwpex1#

因为.yearqtr只接受一个字符串或向量,而不是两个。请务必先阅读帮助文件,以了解参数是什么。下面我们将演示如何生成yearqtr对象。yearqtr对象内部由year + fraction表示,其中4个季度的fraction分别为0、1/4、1/2、3/4(例如,加1表示下一年的同一季度),显示时如下所示。

library (zoo)

as.yearqtr(paste(1930, "Q2"))
## [1] "1930 Q2"

as.yearqtr(paste(1930, 2, sep = "-"))
## [1] "1930 Q2"

as.yearqtr(1930 + (2 - 1)/4)
## [1] "1930 Q2"

要获取Date类对象,请使用上面的as.Date(或者直接使用上面的as. Date,因为它直接表示年和季度)。

as.Date(as.yearqtr(paste(1930, "Q2"))) # start of qtr
## [1] "1930-04-01"

as.Date(as.yearqtr(paste(1930, "Q2")), frac = 1) # end of qtr
## [1] "1930-06-30"
14ifxucb

14ifxucb2#

这就是你想要的吗?

library(zoo)
#> 
#> Attaching package: 'zoo'
#> The following objects are masked from 'package:base':
#> 
#>     as.Date, as.Date.numeric
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
test = data.frame(year = rep(2000, 4),
                qtr = paste0("Q", 1:4))

test |> 
  mutate(
    qtr.num = case_when(
    qtr == "Q1" ~ 0,
    qtr == "Q2" ~ 0.25,
    qtr == "Q3" ~ 0.5,
    qtr == "Q4" ~ 0.75),
  quarter = as.yearqtr(year + qtr.num) |> as.Date())
#>   year qtr qtr.num    quarter
#> 1 2000  Q1    0.00 2000-01-01
#> 2 2000  Q2    0.25 2000-04-01
#> 3 2000  Q3    0.50 2000-07-01
#> 4 2000  Q4    0.75 2000-10-01

创建于2023年1月20日,使用reprex v2.0.2
如果你想要一个更简单的解决方案,你可以使用lubridate中的parse_date_time函数:

library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:base':
#> 
#>     date, intersect, setdiff, union
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
test = data.frame(year = rep(2000, 4),
                qtr = paste0("Q", 1:4))

test |> 
  mutate(
    quarter = parse_date_time(paste(year, qtr), orders="%Y %q"))
#>   year qtr    quarter
#> 1 2000  Q1 2000-01-01
#> 2 2000  Q2 2000-04-01
#> 3 2000  Q3 2000-07-01
#> 4 2000  Q4 2000-10-01

创建于2023年1月20日,使用reprex v2.0.2

相关问题