代码之家  ›  专栏  ›  技术社区  ›  ah bon

将季度日期列与每个季度的最后一天转换为每个季度的第一天,反之亦然

  •  0
  • ah bon  · 技术社区  · 3 年前

    假设我有以下内容 df1 df2 ,如何使用R将每个季度的最后一天转换为中每个季度的第一天 date 列,反之亦然?谢谢

    df1:

    df1 <- structure(list(date = c("2010-3-31", "2010-6-30", "2010-9-30", 
    "2010-12-31", "2011-3-31", "2011-6-30", "2011-9-30", "2011-12-31"
    ), value = c(24.1, 16.4, 18.5, 8.61, 12.6, 20.1, 17.9, 14.5)), class = "data.frame", row.names = c(NA, 
    -8L))
    

    输出:

            date value
    1  2010-3-31 24.10
    2  2010-6-30 16.40
    3  2010-9-30 18.50
    4 2010-12-31  8.61
    5  2011-3-31 12.60
    6  2011-6-30 20.10
    7  2011-9-30 17.90
    8 2011-12-31 14.50
    

    df2:

    df2 <- structure(list(date = c("2010-1-1", "2010-4-1", "2010-7-1", "2010-10-1", 
    "2011-1-1", "2011-4-1", "2011-7-1", "2011-10-1"), value = c(24.1, 
    16.4, 18.5, 8.61, 12.6, 20.1, 17.9, 14.5)), class = "data.frame", row.names = c(NA, 
    -8L))
    

    输出:

          date value
    1  2010-1-1 24.10
    2  2010-4-1 16.40
    3  2010-7-1 18.50
    4 2010-10-1  8.61
    5  2011-1-1 12.60
    6  2011-4-1 20.10
    7  2011-7-1 17.90
    8 2011-10-1 14.50
    
    1 回复  |  直到 3 年前
        1
  •  1
  •   G. Grothendieck    3 年前

    1) 将yearqtr对象转换为Date类将得到季度的第一个,因此

    library(dplyr)
    library(zoo)
    
    df1 %>%
      mutate(date = as.Date(as.yearqtr(as.Date(date))))
    

    给:

            date value
    1 2010-01-01 24.10
    2 2010-04-01 16.40
    3 2010-07-01 18.50
    4 2010-10-01  8.61
    5 2011-01-01 12.60
    6 2011-04-01 20.10
    7 2011-07-01 17.90
    8 2011-10-01 14.50
    

    2) 为了得到季度末的音符 as.Date.yearqtr 有一个 frac= 参数,对于季度开始为0(默认值),对于季度结束为1或两者之间的任何分数。

    df2 %>%
      mutate(date = as.Date(as.yearqtr(as.Date(date)), frac = 1))
    

    给:

            date value
    1 2010-03-31 24.10
    2 2010-06-30 16.40
    3 2010-09-30 18.50
    4 2010-12-31  8.61
    5 2011-03-31 12.60
    6 2011-06-30 20.10
    7 2011-09-30 17.90
    8 2011-12-31 14.50
    

    3) 另一种可能性是,不使用日期来表示季度,而是直接将其表示为yearqtr对象。yearqtr对象在内部是4个季度的年+0、1/4、1/2、3/4,因此可以很容易地对它们进行操作和排序,例如,如果yq是yearqter对象,那么yq+1/4是下一个季度。

    df1 %>%
      mutate(date = as.yearqtr(as.Date(date)))
    

    给:

         date value
    1 2010 Q1 24.10
    2 2010 Q2 16.40
    3 2010 Q3 18.50
    4 2010 Q4  8.61
    5 2011 Q1 12.60
    6 2011 Q2 20.10
    7 2011 Q3 17.90
    8 2011 Q4 14.50
    
    推荐文章