如何在R中将字符转换为日期格式?
How to convert character to Date format in R?
如何将以下字符转换为日期格式?
YYYY.MM
我遇到了处理第 10 个月小数点后零的问题。
说
2012.10
在我的输入源数据中显示为
2012.1
缺少零 post 小数。如何将其恢复为日期格式?
由于您只有 year
和 month
,因此您需要在转换为日期之前为 day
分配一些值。在下面的示例中,日期被任意选择为 15
.
如果输入是字符
dates = c("2012.10", "2012.01")
lubridate::ymd(paste0(year_month = dates, day = "15"))
#[1] "2012-10-15" "2012-01-15"
如果输入是数字
dates = c(2012.10, 2012.01)
do.call(c, lapply(strsplit(as.character(dates), "\."), function(d){
if(nchar(d[2]) == 1){
d[2] = paste0(d[2],"0")
}
lubridate::ymd(paste0(year = d[1], month = d[2], day = "15"))
}))
#[1] "2012-10-15" "2012-01-15"
zoo 包有一个 "yearmon"
class 用于表示没有日期的年月。在内部它将它们存储为年 + 分数,其中分数 = 0 表示一月,1/12 表示二月,2/12 表示三月等等,但它以更好的格式打印并按预期排序。假设您输入的 x
是数字,将其转换为具有 2 位月份的字符,然后应用 as.yearmon
并采用适当的格式。
library(zoo)
x <- c(2012.1, 2012.01) # test data
as.yearmon(sprintf("%.2f", x), "%Y.%m")
## [1] "Oct 2012" "Jan 2012"
如果需要,as.Date
可用于将 "yearmon"
对象转换为 "Date"
class,但通常没有必要。
as.Date(as.yearmon(sprintf("%.2f", x), "%Y.%m"))
## [1] "2012-10-01" "2012-01-01"
下面的代码使用 lubridate
包中的 ymd()
函数和 sprintf()
来强制以数字格式给出的日期
dates <- c(2012.1, 2012.01)
以及以字符串形式给出的日期
dates <- c("2012.1", "2012.01")
其中小数点左边的部分表示年份,小数部分表示月份。
lubridate::ymd(sprintf("%.2f", as.numeric(dates)), truncated = 1L)
[1] "2012-10-01" "2012-01-01"
格式规范 %.2f
告诉 sprintf()
使用 2 个小数位。
参数truncated = 1L
表示缺少一个日期元素(day),应按默认值(每月的第一天)补全。或者,可以在格式规范中直接将月中的日期指定为 sprintf()
:
lubridate::ymd(sprintf("%.2f-15", as.numeric(dates)))
[1] "2012-10-15" "2012-01-15"
如何将以下字符转换为日期格式?
YYYY.MM
我遇到了处理第 10 个月小数点后零的问题。 说
2012.10
在我的输入源数据中显示为
2012.1
缺少零 post 小数。如何将其恢复为日期格式?
由于您只有 year
和 month
,因此您需要在转换为日期之前为 day
分配一些值。在下面的示例中,日期被任意选择为 15
.
如果输入是字符
dates = c("2012.10", "2012.01")
lubridate::ymd(paste0(year_month = dates, day = "15"))
#[1] "2012-10-15" "2012-01-15"
如果输入是数字
dates = c(2012.10, 2012.01)
do.call(c, lapply(strsplit(as.character(dates), "\."), function(d){
if(nchar(d[2]) == 1){
d[2] = paste0(d[2],"0")
}
lubridate::ymd(paste0(year = d[1], month = d[2], day = "15"))
}))
#[1] "2012-10-15" "2012-01-15"
zoo 包有一个 "yearmon"
class 用于表示没有日期的年月。在内部它将它们存储为年 + 分数,其中分数 = 0 表示一月,1/12 表示二月,2/12 表示三月等等,但它以更好的格式打印并按预期排序。假设您输入的 x
是数字,将其转换为具有 2 位月份的字符,然后应用 as.yearmon
并采用适当的格式。
library(zoo)
x <- c(2012.1, 2012.01) # test data
as.yearmon(sprintf("%.2f", x), "%Y.%m")
## [1] "Oct 2012" "Jan 2012"
如果需要,as.Date
可用于将 "yearmon"
对象转换为 "Date"
class,但通常没有必要。
as.Date(as.yearmon(sprintf("%.2f", x), "%Y.%m"))
## [1] "2012-10-01" "2012-01-01"
下面的代码使用 lubridate
包中的 ymd()
函数和 sprintf()
来强制以数字格式给出的日期
dates <- c(2012.1, 2012.01)
以及以字符串形式给出的日期
dates <- c("2012.1", "2012.01")
其中小数点左边的部分表示年份,小数部分表示月份。
lubridate::ymd(sprintf("%.2f", as.numeric(dates)), truncated = 1L)
[1] "2012-10-01" "2012-01-01"
格式规范 %.2f
告诉 sprintf()
使用 2 个小数位。
参数truncated = 1L
表示缺少一个日期元素(day),应按默认值(每月的第一天)补全。或者,可以在格式规范中直接将月中的日期指定为 sprintf()
:
lubridate::ymd(sprintf("%.2f-15", as.numeric(dates)))
[1] "2012-10-15" "2012-01-15"