在 R 中创建日历 df

Creating Calendar df in R

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

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))

我遇到的问题是我无法添加未缩写的 date/month 并且不确定我是否可以在 mutate 中添加 Month_Year/Quarter_Year 以便将值考虑在内。是否可能添加这些值还是我必须按照以前的方式添加它们?谢谢!

通过将 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()

Returns:

        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

如果您使用内置 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