【问题标题】:Converting yearmon column to last date of the month in R将yearmon列转换为R中月份的最后一个日期
【发布时间】:2016-05-19 03:40:41
【问题描述】:

我有一个数据框 (df),如下所示:

Date        Arrivals

2014-07      100
2014-08      150
2014-09      200

我知道我可以将 yearmon 日期转换为每个月的第一个日期,如下所示:

df$Date <- as.POSIXct(paste0(as.character(df[,1]),"-01"), format = "%Y-%m-%d")

但是,鉴于我的数据要到月底才可用,我想将其索引到末尾而不是开头,我无法弄清楚。任何帮助表示赞赏。

【问题讨论】:

    标签: r zoo lubridate


    【解决方案1】:

    如果Date 变量是一个实际的yearmon 类向量,来自zoo 包,as.Date.yearmon 方法可以通过其参数frac 执行您想要的操作。

    使用您的数据,并假设 Date 最初是一个字符向量

    library("zoo")
    df <- data.frame(Date = c("2014-07", "2014-08", "2014-09"),
                     Arrivals = c(100, 150, 200))
    

    我将其转换为 yearmon 向量:

    df <- transform(df, Date2 = as.yearmon(Date))
    

    假设这是您所拥有的,那么您可以使用as.Date()frac = 1 实现您想要的:

    df <- transform(df, Date3 = as.Date(Date2, frac = 1))
    

    给出:

    > df
         Date Arrivals    Date2      Date3
    1 2014-07      100 Jul 2014 2014-07-31
    2 2014-08      150 Aug 2014 2014-08-31
    3 2014-09      200 Sep 2014 2014-09-30
    

    这显示了各个步骤。如果你只想要最后的 Date 这是一个单行

    ## assuming `Date` is a `yearmon` object
    df <- transform(df, Date = as.Date(Date, frac = 1))
    ## or if not a `yearmon`
    df <- transform(df, Date = as.Date(as.yearmon(Date), frac = 1))
    

    yearmon 对象转换为Date 对象时,分配给结果日期的月份小数部分中的参数frac。因此,要获得当月的第一天,而不是像您的问题所示转换为字符并粘贴到 "-01" 上,最好使用 frac = 0 强制转换为 Date 对象。

    如果您的df 中的Date 不是yearmon 类对象,那么您可以通过将其转换为一个然后使用上述as.Date() 方法来解决您的问题。

    【讨论】:

      【解决方案2】:

      这是一种使用 zoo 包的方法。

      R 代码:

      library(zoo)
      df
      #      Date Arrivals
      # 1 2014-07      100
      # 2 2014-08      150
      # 3 2014-09      200
      
      df$Date <- as.Date(as.yearmon(df$Date), frac = 1)
      
      # output
      #         Date Arrivals
      # 1 2014-07-31      100
      # 2 2014-08-31      150
      # 3 2014-09-30      200
      

      【讨论】:

        【解决方案3】:

        使用lubridate,可以加一个月减一天得到该月的最后一天:

        library(lubridate)
        
        ymd(paste0(df$Date, '-01')) + months(1) - days(1)
        # [1] "2014-07-31" "2014-08-31" "2014-09-30"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-12-29
          • 1970-01-01
          • 2020-05-22
          • 2020-06-21
          • 2022-08-09
          • 2018-12-24
          • 1970-01-01
          相关资源
          最近更新 更多