我有一个yearmon
对象:
require(zoo)
date1 <- as.yearmon("Mar 2012", "%b %Y")
class(date1)
# [1] "yearmon"
如何从中提取月份和年份?
month1 <- fn(date1)
year1 <- fn(date1)
我应该使用什么功能代替fn()
答案 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