在R中将yearmon列转换为每月的最后一天

5

我有一个数据框(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")

然而,考虑到我的数据直到月底才会可用,我希望将其索引到月底而不是月初,但我无法弄清楚如何操作。感谢任何帮助。

3个回答

14
如果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 来实现您想要的结果:

假设这就是您所拥有的内容,那么您可以使用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类对象,则可以通过将其转换为yearmon对象,然后按照上述方法使用as.Date()方法来解决问题。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接