将 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
我有一个如下所示的数据框 (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