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

Ric*_*chS 2 r zoo lubridate

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

Date        Arrivals

2014-07      100
2014-08      150
2014-09      200
Run Code Online (Sandbox Code Playgroud)

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

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

但是,鉴于我的数据直到月底才可用,我想将其编入索引到结尾而不是开头,我无法弄明白.任何帮助赞赏.

Rei*_*son 10

如果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))
Run Code Online (Sandbox Code Playgroud)

我将其转换为yearmon矢量:

df <- transform(df, Date2 = as.yearmon(Date))
Run Code Online (Sandbox Code Playgroud)

假设这是你所拥有的,那么你可以达到你想要使用的是什么as.Date()frac = 1:

df <- transform(df, Date3 = as.Date(Date2, frac = 1))
Run Code Online (Sandbox Code Playgroud)

这使:

> 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
Run Code Online (Sandbox Code Playgroud)

这显示了各个步骤.如果你只想要最终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))
Run Code Online (Sandbox Code Playgroud)

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

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


Man*_*han 7

这是一种使用动物园包来做到这一点的方法。

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
Run Code Online (Sandbox Code Playgroud)