将 yearmon 列转换为 R 中月份的最后一个日期

Converting yearmon column to last date of the month in R

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

Date        Arrivals

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

我知道我可以按如下方式将年月日转换为每个月的第一天:

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

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

如果 Date 变量是一个实际的 yearmon class 向量,来自 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))

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

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

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

library(lubridate)

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

这里有一种使用 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