r-创建具有不同天数的开始日期范围



我有一个数据框架,其中包含2014年至2021年财政季度的结束日期列表。我想创建一个单独的列,以每个季度的开头。请注意,格式为YYYY-MM-DD。它看起来像这样:

df <- data.frame(end = c("2014-12-31", "2015-03-31","2015-06-30", "2015-09-30", "2015-12-31", "2016-03-31"))

日期季度总是来自

  • 1月1日至3月31日
  • 4月1日至6月30日
  • 7月1日至9月30日
  • 10月1日至12月31日

我当前的代码通过使用ifelse语句为每个日期创建一个单独的列,然后像这样将它们添加在一起:

hmd$dtime_2 <- ifelse(hmd$dtime == "2015-03-31","2014-01-01", "")
hmd$dtime_3 <- ifelse(hmd$dtime == "2015-06-30", "2015-04-01", "")
hmd$dtime_4 <- ifelse(hmd$dtime == "2015-09-30","2015-07-01", "")
hmd$dtime_5 <- ifelse(hmd$dtime == "2015-12-31", "2015-10-01", "")

我知道必须有一个更简单的方法来做到这一点,我会感谢你的帮助!

这在lubridate中很容易实现。用floor_date获取月的第一天,并用%m-% months(2)将两个月缩回到它。然后你会得到本学期的第一次约会。

library(lubridate)
library(dplyr)
df %>% 
mutate(start = floor_date(ymd(end), unit = "month") %m-% months(2))
end      start
1 2014-12-31 2014-10-01
2 2015-03-31 2015-01-01
3 2015-06-30 2015-04-01
4 2015-09-30 2015-07-01
5 2015-12-31 2015-10-01
6 2016-03-31 2016-01-01

您可以使用seq.Date

sapply(df$end, (x) as.character(seq.Date(as.Date(x) + 1, by='-1 month', length.out=2)[2]))
# [1] "2014-12-01" "2015-03-01" "2015-06-01" "2015-09-01" "2015-12-01" "2016-03-01"

数据:

df <- structure(list(end = structure(c(16435, 16525, 16616, 16708, 
16800, 16891), class = "Date")), row.names = c(NA, -6L), class = "data.frame")

1(基本R这可以在基本R中完成。这里的dplyr没有优势,但如果您已经在使用dplyr,则可以用mutate替换transform,使其他一切保持不变。这将start作为Date类对象,但如果需要字符,则用as.character(...)包围右手边。

transform(df, start = as.Date(cut(as.Date(end), "quarter")))
##          end      start
## 1 2014-12-31 2014-10-01
## 2 2015-03-31 2015-01-01
## 3 2015-06-30 2015-04-01
## 4 2015-09-30 2015-07-01
## 5 2015-12-31 2015-10-01
## 6 2016-03-31 2016-01-01

2(基本R-2这里有一种不同的使用基本R的方法。我们将end转换为Date类,然后减去80天。这足以让我们进入本季度的第一个月,这样我们就可以获取年份和月份,并添加-01后缀。这给出了CCD_ 10作为字符向量。如果要将其作为Date类对象,请用as.Date(...)围绕右侧。

transform(df, start = format(as.Date(df$end) - 80, "%Y-%m-01"))
##          end      start
## 1 2014-12-31 2014-10-01
## 2 2015-03-31 2015-01-01
## 3 2015-06-30 2015-04-01
## 4 2015-09-30 2015-07-01
## 5 2015-12-31 2015-10-01
## 6 2016-03-31 2016-01-01

3(yearqtr另一种方法是使用yearqtr类。转换为Date对象,然后转换为yearqtr并返回到Date。yearqtr对象专门表示没有月份或天数的年份和季度,当转换回Date时,会给出季度开始日期(如果使用as.Date的yearqtr方法的frac=1参数,则为季度结束日期(。(1(中对CCD_ 12和CCD_。

library(zoo)
transform(df, start = as.Date(as.yearqtr(as.Date(end))))
##          end      start
## 1 2014-12-31 2014-10-01
## 2 2015-03-31 2015-01-01
## 3 2015-06-30 2015-04-01
## 4 2015-09-30 2015-07-01
## 5 2015-12-31 2015-10-01
## 6 2016-03-31 2016-01-01

相关内容

  • 没有找到相关文章

最新更新