[英]Convert numeric date format (YYYYMMDD; 20150101) into Year-Month
[英]Convert Factor to Date (Year-Month)
我的资料栏看起来像...
date
<fctr>
14-Jan
14-Feb
14-Mar
15-Jan
只是想知道如何将其转换为日期,因为当我在此代码中打孔时,会得到NA
hand$date <- as.Date(hand$date, format = "%y-%b")
date
<fctr>
NA
NA
NA
NA
谢谢您的帮助!
OP已请求将data-frame列中的Year-Mon(每月的无日)转换为Date,这是一个因素。 如果没有月份,则日期是不完整的,会产生NA
。
有多种选项可用于处理不完整的日期。
as.Date()
并补充每月的某天 如db所建议的类似形式:
as.Date(paste0(hand$date, "-01"), "%y-%b-%d")
#[1] "2014-01-01" "2014-02-01" "2014-03-01" "2015-01-01"
lubridate::ymd()
lubridate
软件包的ymd()
函数具有一个truncated
参数来解析不完整的日期:
lubridate::ymd(hand$date, truncated = 1L)
#[1] "2014-01-01" "2014-02-01" "2014-03-01" "2015-01-01"
请注意, lubridate
自动假定为每月的第一天。
zoo::as.yearmon()
和zoo::as.Date()
Sagar和statoptim已经建议使用zoo
包中的as.yearmon()
函数。
Sagan的答案是不完整的,因为as.yearmon()
返回的类为yearmon
但不是Date
的对象:
str(zoo::as.yearmon(hand$date, "%y-%b"))
#Class 'yearmon' num [1:4] 2014 2014 2014 2015
statoptim的答案不必要地复杂,因为yearmon
可以直接强制为Date
:
zoo::as.Date(zoo::as.yearmon(hand$date, "%y-%b"))
#[1] "2014-01-01" "2014-02-01" "2014-03-01" "2015-01-01"
请注意,如果我们尚未预先加载zoo
,则必须使用zoo::as.Date()
,因为基数R的as.Date()
不知道如何处理yearmon
对象。
zoo::as.Date()
默认自动设置为每月的第一天。 frac
参数可用于控制返回每月的哪一天,例如,
zoo::as.Date(zoo::as.yearmon(hand$date, "%y-%b"), frac = 1)
#[1] "2014-01-31" "2014-02-28" "2014-03-31" "2015-01-31"
返回每个月的最后一天。
当前语言环境可能会影响缩写月份名称的解释(在statoptim的答案中可能就是这种情况)。
有一个相关问题的答案 ,建议您查看?as.Date
的示例部分:
## read in date info in format 'ddmmmyyyy'
## This will give NA(s) in some locales; setting the C locale
## as in the commented lines will overcome this on most systems.
## lct <- Sys.getlocale("LC_TIME"); Sys.setlocale("LC_TIME", "C")
x <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
z <- as.Date(x, "%d%b%Y")
## Sys.setlocale("LC_TIME", lct)
z
以下将起作用。
> library(zoo)
> as.yearmon("14-Jan", "%y-%b")
[1] "Jan 2014"
zoo软件包文档包含以下示例,该示例在我的R上也返回NA
zoo::as.yearmon("mar07", "%b%y")
我正在使用gsub将“ Jan”替换为“ 01”。 我看到这不是最有效的代码,但希望它现在对您有帮助。
library(zoo)
df = data.frame(date = c("14-Jan", "14-Feb", "15-Jan"), stringsAsFactors = F)
month.abb
# [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" ....
month.num = substr( paste0("0", c(1:12)), start=c(rep(1,9), rep(2,3)), stop=3)
head(month.num)
# [1] "01" "02" "03" "04" "05" "06"
# can't think of or find ways to vectorize gsub
for(i in 1:12) {
df$date = gsub(df$date, pattern=month.abb[i], replacement=month.num[i])
}
as.Date(as.yearmon(df$date, format = "%y-%m"))
# [1] "2014-01-01" "2014-02-01" "2015-01-01"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.