如何在R中将整数转换为日期格式?

时间:2018-09-16 00:33:14

标签: r

我正在尝试将R数据框中的整数数据转换为日期格式。

数据位于orig_svcg_filtered数据框内名为svcg_cycle的列下。

原始数据看起来像200502、200503等,我希望将其转换为yyyy-mm-dd格式。

我正在尝试使用以下代码:

as.Date(orig_svcg_filtered$svcg_cycle, origin = "2000-01-01")

但是输出不是我期望的:

[1] "2548-12-15" "2548-12-15" "2548-12-15" "2548-12-15" "2548-12-15" 

应该是2005-02-01、2005-03-01等。

如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

如果有

x <- c(200502, 200503)

然后

as.Date(x, origin = "2000-01-01")

告诉R您想要2000-01-01之后的200,502天和200,503天。来自help("as.Date")

  

as.Date将接受数字数据(自一个纪元以来的天数),   但前提是提供了原产地。

因此,整数数据提供的是原始日期之后的天数,而不是日期的某种数字代码,例如“ 2005-02-01”的日期为200502。

你想要的是

as.Date(paste(substr(x, 1, 4), substr(x, 5, 6), "01", sep = "-"))

# [1] "2005-02-01" "2005-03-01"

paste(substr(x, 1, 4), substr(x, 5, 6), "01", sep = "-")

part接受您的整数并创建类似的字符串

# [1] "2005-02-01" "2005-03-01"

然后as.Date()知道如何处理它们。

您也可以做类似的事情

as.Date(paste0(x, "01"), format = "%Y%m%d")

# [1] "2005-02-01" "2005-03-01"

这只是将"01"粘贴到每个元素(当天),转换为字符,然后告诉as.Date()将日期读入的格式。 (请参见help("as.Date")help("strptime"))。

答案 1 :(得分:0)

我喜欢使用Regex来解决这类字符串格式问题。默认情况下,as.Date仅检查几种标准日期格式,例如YYYY-MM-DD。 origin用于具有整数日期(即距某个参考点的秒数)的情况,但在这种情况下,您的日期实际上不是整数日期,而只是格式化为整数字符串的日期。

我们只需用破折号将月份和日期分开,然后添加一天(在这种情况下是月份的第一天)以使其成为有效日期(您必须有一天的时间将其存储为R中的日期对象) 。正则表达式位捕获组1中的前4位和组2中的后两位。然后,我们将用破折号分隔的两组与日期结合起来。

as.Date(gsub("^(\\d{4})(\\d{2})", "\\1-\\2-01", x))

[1] "2005-02-01" "2005-03-01"

在这种情况下,您无需指定format,因为YYYY-MM-DD是as.Date检查的标准格式之一,但是format参数为format = "%Y-%m-%d" < / p>