【问题标题】:How to add month column based on numeric day value如何根据数字天值添加月份列
【发布时间】:2021-05-25 07:18:41
【问题描述】:

我有超过 20 年的数据,其中有一列包含从 1999 年到 2020 年的年份。我还有另一列包含天数。但是,我的天数列是数字的。例如,1999 年 1 月 1 日标记为“1”,1999 年 1 月 2 日标记为“2”,1999 年 1 月 3 日标记为“3”,依此类推,直到 1999 年 12 月 31 日标记为“365”。然后下一年再次从 2000 年开始,第 1 天为 2000 年 1 月 1 日.......第 32 天是 2000 年 2 月 1 日,第 33 天是 2000 年 2 月 2 日,依此类推,直到 2020 年。 我需要根据日值创建一个包含月份的新列。例如,第 1 天到第 31 天应该是 1 月,第 32 天 60 应该是 2 月,依此类推,一直到 12 月,持续多年。 附件是一个小数据集来说明我正在尝试做的事情。我没有尝试过任何事情,因为我不知道我该怎么做。我阅读了有关格式和 as.Date 的信息,但没有发现与此示例相近的内容。

sal <- structure(list(year = c(1999, 1999, 1999, 1999, 1999, 1999, 1999, 
1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 
1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 
1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 1999, 
1999, 1999, 1999, 1999), day = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 
27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 
43, 44)), row.names = c(NA, -44L), class = c("tbl_df", "tbl", 
"data.frame"))

 Ending dataset should look like below:

   year day  month
1  1999   1  January
2  1999   2  January
3  1999   3  ...
4  1999   4  ...
5  1999   5  ...
6  1999   6
7  1999   7
8  1999   8
9  1999   9
10 1999  10
11 1999  11
12 1999  12
13 1999  13
14 1999  14
15 1999  15
16 1999  16
17 1999  17
18 1999  18
19 1999  19
20 1999  20
21 1999  21
22 1999  22
23 1999  23
24 1999  24
25 1999  25
26 1999  26
27 1999  27
28 1999  28
29 1999  29
30 1999  30  ...
31 1999  31  January
32 1999  32  February
33 1999  33  February
34 1999  34  ...
35 1999  35
36 1999  36
37 1999  37
38 1999  38
39 1999  39
40 1999  40
41 1999  41
42 1999  42
43 1999  43
44 1999  44
45   NA  NA

【问题讨论】:

    标签: r


    【解决方案1】:

    获取日期

    sal$date=as.Date(sal$day-1,origin=paste0(sal$year,"-01-01"))
    

    获取月份名称

    format(sal$date,"%B")
    

    【讨论】:

      【解决方案2】:

      你可以使用:

      library(tidyverse)
      library(lubridate)
      sal %>%
        mutate(date = as.Date(paste0(year, '-01-01')) + days(day - 1),
               month = month.name[month(date)])
      

      【讨论】:

        【解决方案3】:

        使用data.table,您可以这样做:

        require(data.table)
        
        setDT(sal)
        sal[ , month := format(as.IDate(paste0(year, '-', day), format = '%Y-%j'), '%B') ]
        

        【讨论】:

        • 您需要考虑年份,因为日期会根据年份是否为闰年而变化。例如,1999 年的第 59 天和 2000 年的第 59 天是不同的月份
        猜你喜欢
        • 1970-01-01
        • 2019-07-11
        • 2020-12-31
        • 1970-01-01
        • 2012-01-08
        • 2021-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多