【问题标题】:Creating Calendar df in R在 R 中创建日历 df
【发布时间】:2021-05-24 10:27:28
【问题描述】:

我目前正在创建一个日历 df 以加入我的其他 dfs,并最初按以下方式对其进行编码:

Date <- seq(as.Date("2020-01-01"), as.Date("2021-12-31"), by="days")
Calendar <- data.frame(Date)

Calendar$DateNo <- format(Calendar$Date, format = "%d")
Calendar$NameDay <- format(Calendar$Date, format = "%A")
Calendar$MonthNo <- format(Calendar$Date, format = "%m")
Calendar$NameMonth <- format(Calendar$Date, format = "%B")
Calendar$NameMonthShort <- format(Calendar$Date, format = "%b")
Calendar$Week <- format(Calendar$Date, format = "%V")
Calendar$Year <- format(Calendar$Date, format = "%Y")
Calendar$Quarter <- quarter(Calendar$Date, with_year = F, fiscal_start = 7)
Calendar$Month_Year <-paste(Calendar$NameMonthShort,Calendar$Year,sep="-")
Calendar$Quarter_Year <-paste(Calendar$Quarter,Calendar$Year,sep="-")

在将我的数据绘制到 ggplot 中出现一些问题后,我遇到了另一种使用 lubridate 包和 mutate 创建它的方法。我的新代码如下:

Date <- seq(as.Date("2020-01-01"), as.Date("2021-12-31"), by="days")
Calendar <- data.frame(Date)

Calendar <- Calendar %>%
  mutate(
    DateNo = day(Date),
    NameDay = wday(Date,label = TRUE),
    MonthNo = month(Date),
    NameMonth = month(Date, label = TRUE),
    NameMonthShort = month(Date, label = TRUE),
    Week = week(Date),
    Year = year(Date),
    Quarter = quarter(Date, with_year = F, fiscal_start = 7))

我遇到的问题是我无法添加未缩写的日期/月份,并且不确定是否可以在 mutate 中添加 Month_Year/Quarter_Year 以便将值考虑在内。是否可以将这些值添加到或我必须像以前一样添加它们吗?谢谢!

【问题讨论】:

    标签: r dataframe dplyr lubridate


    【解决方案1】:

    通过将abbr=FALSE 切换为month(),可以轻松添加长月份名称。

    过去几个季度或几个月到几年需要第二次变异,如下所示。

    编辑 由于粘贴创建的是字符向量而不是因子,因此您需要手动指定因子级别:

    monthlevels = c(
                    'Jan-2020','Feb-2020','Mar-2020','Apr-2020','May-2020','Jun-2020',
                    'Jul-2020','Aug-2020','Sep-2020','Oct-2020','Nov-2020','Dec-2020',
                    'Jan-2021','Feb-2021','Mar-2021','Apr-2021','May-2021','Jun-2021',
                    'Jul-2021','Aug-2021','Sep-2021','Oct-2021','Nov-2021','Dec-2021')
                    
    quarterlevels = c('1-2020','2-2020','3-2020','4-2020','1-2021','2-2021','3-2021','4-2021')
    
    
    Calendar %>%
      mutate(
        DateNo = day(Date),
        NameDay = wday(Date,label = TRUE),
        MonthNo = month(Date),
        NameMonth = month(Date, label = TRUE, abbr=FALSE), ## added abbr=FALSE
        NameMonthShort = month(Date, label = TRUE),
        Week = week(Date),
        Year = year(Date),
        Quarter = quarter(Date, with_year = F, fiscal_start = 7)) %>% 
        ## added second mutate() to paste fields created by the first mutate
        mutate(
        QuarterYear = factor(paste(Quarter, Year, sep='-'), levels=quarterlevels),
        MonthYear = factor(paste(NameMonthShort,Year,sep="-"),levels=monthlevels     
        ) %>% head()
    

    返回:

            Date DateNo NameDay MonthNo NameMonth NameMonthShort Week Year Quarter
    1 2020-01-01      1     Wed       1   January            Jan    1 2020       3
    2 2020-01-02      2     Thu       1   January            Jan    1 2020       3
    3 2020-01-03      3     Fri       1   January            Jan    1 2020       3
    4 2020-01-04      4     Sat       1   January            Jan    1 2020       3
    5 2020-01-05      5     Sun       1   January            Jan    1 2020       3
    6 2020-01-06      6     Mon       1   January            Jan    1 2020       3
      QuarterYear MonthYear
    1      3-2020  Jan-2020
    2      3-2020  Jan-2020
    3      3-2020  Jan-2020
    4      3-2020  Jan-2020
    5      3-2020  Jan-2020
    6      3-2020  Jan-2020
    

    【讨论】:

      【解决方案2】:

      如果您使用内置的as.POSIXlt,您可能会发现它更容易,不需要lubridate。只需将它应用于您的序列,您就会得到一个列表类型的格式,

      Date <- as.POSIXlt(seq(as.Date("2020-01-01"), as.Date("2020-06-30"), by="7 days"))
      ## Note: shortened for sake of brevity
      

      已将所需信息存储在$ 可以访问的对象中。

      attr(Date, "names")
      # [1] "sec"   "min"   "hour"  "mday"  "mon"   "year"  "wday"  "yday"  "isdst"
      

      由于存储格式的原因,需要进行一些小的转换,以及一些辅助函数,如weekdaysquartersstrftime。此外,我们还可以使用内置常量month.namemonth.abb

      Calendar <- data.frame(Date, 
                             DateNo=Date$mday,
                             NameDay=weekdays(Date),
                             MonthNo=Date$mon + 1,
                             NameMonth=month.name[Date$mon + 1],
                             NameMonthShort=month.abb[Date$mon + 1],
                             Week=strftime(Date, "%V"),
                             Year=1900 + Date$year,
                             Quarter=quarters(Date)
      )
      

      结果

      Calendar
      #          Date DateNo   NameDay MonthNo NameMonth NameMonthShort Week Year Quarter
      # 1  2020-01-01      1 Wednesday       1   January            Jan   01 2020      Q1
      # 2  2020-01-08      8 Wednesday       1   January            Jan   02 2020      Q1
      # 3  2020-01-15     15 Wednesday       1   January            Jan   03 2020      Q1
      # 4  2020-01-22     22 Wednesday       1   January            Jan   04 2020      Q1
      # 5  2020-01-29     29 Wednesday       1   January            Jan   05 2020      Q1
      # 6  2020-02-05      5 Wednesday       2  February            Feb   06 2020      Q1
      # 7  2020-02-12     12 Wednesday       2  February            Feb   07 2020      Q1
      # 8  2020-02-19     19 Wednesday       2  February            Feb   08 2020      Q1
      # 9  2020-02-26     26 Wednesday       2  February            Feb   09 2020      Q1
      # 10 2020-03-04      4 Wednesday       3     March            Mar   10 2020      Q1
      # 11 2020-03-11     11 Wednesday       3     March            Mar   11 2020      Q1
      # 12 2020-03-18     18 Wednesday       3     March            Mar   12 2020      Q1
      # 13 2020-03-25     25 Wednesday       3     March            Mar   13 2020      Q1
      # 14 2020-04-01      1 Wednesday       4     April            Apr   14 2020      Q2
      # 15 2020-04-08      8 Wednesday       4     April            Apr   15 2020      Q2
      # 16 2020-04-15     15 Wednesday       4     April            Apr   16 2020      Q2
      # 17 2020-04-22     22 Wednesday       4     April            Apr   17 2020      Q2
      # 18 2020-04-29     29 Wednesday       4     April            Apr   18 2020      Q2
      # 19 2020-05-06      6 Wednesday       5       May            May   19 2020      Q2
      # 20 2020-05-13     13 Wednesday       5       May            May   20 2020      Q2
      # 21 2020-05-20     20 Wednesday       5       May            May   21 2020      Q2
      # 22 2020-05-27     27 Wednesday       5       May            May   22 2020      Q2
      # 23 2020-06-03      3 Wednesday       6      June            Jun   23 2020      Q2
      # 24 2020-06-10     10 Wednesday       6      June            Jun   24 2020      Q2
      # 25 2020-06-17     17 Wednesday       6      June            Jun   25 2020      Q2
      # 26 2020-06-24     24 Wednesday       6      June            Jun   26 2020      Q2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多