我正在尝试将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等。
如何解决这个问题?
答案 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>