Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中创建日历df_R_Dplyr_Lubridate - Fatal编程技术网

在R中创建日历df

在R中创建日历df,r,dplyr,lubridate,R,Dplyr,Lubridate,我目前正在创建一个日历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") Calen

我目前正在创建一个日历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="-")

Date通过包含
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

如果使用内置的
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
由于存储格式的原因,需要进行一些较小的转换,以及一些辅助功能,如
工作日
季度
,和
strftime
。此外,我们可以使用内置常量
month.name
month.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)
)
attr(Date, "names")
# [1] "sec"   "min"   "hour"  "mday"  "mon"   "year"  "wday"  "yday"  "isdst"
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