从zoo :: yearmon对象中提取月份和年份

时间:2012-03-17 11:23:45

标签: r

我有一个yearmon对象:

require(zoo)
date1 <- as.yearmon("Mar 2012", "%b %Y")
class(date1)
# [1] "yearmon"

如何从中提取月份和年份?

month1 <- fn(date1)
year1 <- fn(date1)

我应该使用什么功能代替fn()

7 个答案:

答案 0 :(得分:142)

format()类的对象使用"yearmon"方法。这是您的示例日期(正确创建!)

date1 <- as.yearmon("Mar 2012", "%b %Y")

然后我们可以根据需要提取日期部分:

> format(date1, "%b") ## Month, char, abbreviated
[1] "Mar"
> format(date1, "%Y") ## Year with century
[1] "2012"
> format(date1, "%m") ## numeric month
[1] "03"

这些作为字符返回。如果您希望将年份或数字月份作为数字变量,例如

,请在适当的情况下换行as.numeric()
> as.numeric(format(date1, "%m"))
[1] 3
> as.numeric(format(date1, "%Y"))
[1] 2012

有关详细信息,请参阅?yearmon?strftime - 后者解释了您可以使用的占位符字符。

答案 1 :(得分:99)

lubridate package对于这种事情来说是惊人的:

> require(lubridate)
> month(date1)
[1] 3
> year(date1)
[1] 2012

答案 2 :(得分:15)

我知道OP在这里使用zoo,但我发现这个帖子在搜索同一问题的标准ts解决方案。所以我想我也为zoo添加ts - 免费答案。

# create an example Date 
date_1 <- as.Date("1990-01-01")
# extract year
as.numeric(format(date_1, "%Y"))
# extract month
as.numeric(format(date_1, "%m"))

答案 3 :(得分:12)

您可以使用format

library(zoo)
x <- as.yearmon(Sys.time())
format(x,"%b")
[1] "Mar"
format(x,"%Y")
[1] "2012"

答案 4 :(得分:5)

对于大型载体:

y = as.POSIXlt(date1)$year + 1900    # x$year : years since 1900
m = as.POSIXlt(date1)$mon + 1        # x$mon : 0–11

答案 5 :(得分:0)

这个问题没有准确说明预期的输出是什么,但假设月份你想要月份数(1月= 1)和你想要数字4位数的年份那么假设我们刚刚运行了代码问题:

cycle(date1)
## [1] 3
as.integer(date1)
## [1] 2012

答案 6 :(得分:0)

从1800年至今的数据也有类似的问题,这对我有用:

data2$date=as.character(data2$date) 
lct <- Sys.getlocale("LC_TIME"); 
Sys.setlocale("LC_TIME","C")
data2$date<- as.Date(data2$date, format = "%Y %m %d") # and it works