R中循环中的日期转换

R中循环中的日期转换,r,datetime,as.date,R,Datetime,As.date,你好,再见。在R中以双循环方式转换从Excel导入的日期列时,我在R代码中再次遇到问题。以下代码是我为了转换数据而编写的(从整个数据集的第11列开始转换为第19列,列长为17) 为了转换为正确的格式,我使用as.Date并将其存储在虚拟变量data_01中,然后使用该虚拟变量重新分配原始值 对于“字符”类型的数据,原始数据如下所示(以数据集的第12列为例): 因为我只对数字“43045”感兴趣,并将其转换回日期格式,所以我使用 (grepl("^[[:digit:]]+$",data_agg[[

你好,再见。在R中以双循环方式转换从Excel导入的日期列时,我在R代码中再次遇到问题。以下代码是我为了转换数据而编写的(从整个数据集的第11列开始转换为第19列,列长为17)

为了转换为正确的格式,我使用
as.Date
并将其存储在虚拟变量
data_01
中,然后使用该虚拟变量重新分配原始值

对于“字符”类型的数据,原始数据如下所示(以数据集的第12列为例):

因为我只对数字“43045”感兴趣,并将其转换回日期格式,所以我使用

(grepl("^[[:digit:]]+$",data_agg[[i,m]]))
要查看字符串中是否包含任何数字,如果是,请将其转换回以下代码中表示的正常日期格式:

else if (grepl("^[[:digit:]]+$",data_agg[[i,m]])) {
      data_02 <-  as.Date(as.numeric(data_agg[[i,m]]),origin="1899-12-30")
      data_agg[[i,m]] <- data_02
它应该给我一个调查结果

"2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-12"
[10] "2017-07-20" "2018-06-07" "2018-03-15" "2018-03-06" "2017-10-19" NA               NA               NA
数据集的第12列如下所示:

data_agg[[11]]
 [1] "1970-01-01 04:53:26 UTC" "1970-01-01 04:53:26 UTC" "1970-01-01 04:53:26 UTC" "1970-01-01 04:53:26 UTC" "1970-01-01 04:53:26 UTC" "1970-01-01 04:53:26 UTC"
 [7] "1970-01-01 04:53:26 UTC" "1970-01-01 04:53:26 UTC" "1970-01-01 04:53:22 UTC" "1970-01-01 04:49:27 UTC" "1970-01-01 04:54:49 UTC" "1970-01-01 04:53:25 UTC"
[13] "1970-01-01 04:53:16 UTC" "1970-01-01 04:50:58 UTC" NA                        NA                        NA
data_agg[[12]]
 [1] "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "Yes"   "Yes"   "N/A"   NA      NA      "17476" NA      NA      NA 
它应该给我以下结果:

 [1] "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "Yes"   "Yes"   "N/A"   NA      NA      "2017-11-06" NA      NA      NA 

我错过了什么?非常感谢你的帮助

“2018-03-16 UTC”是字符串,对吗?您可以通过使用str()或class()找到它。如果这是一个字符串,那么
是.POSIXct(data_agg[[i,m]])
总是false。因此,您永远不会执行if/else语句的这一部分。仅供参考:Lubridate有一个函数,用于将YYYY-MM-DD转换为日期,如果失败,将返回NA和警告()<代码>lubridate::ymd(“2018-03-16 UTC”)。这也适用于向量输入(一次整列)。嗨,亚当,谢谢你的回复!在我运行循环之前,“2018-03-16 UTC”是“POSIXct”“POSIXt”。只需注意,我通过谷歌搜索解决了这个问题。我尝试了不同的格式化数据帧的方法。我没有格式化向量中的每个对象,而是选择使用lubridate::ymd格式化数据帧中的每个向量,正如Adam Sampson在第11列中建议的那样。对于第12列,由于对整个列进行日期格式化会导致警告,因此我使用grepl查找需要格式化的对象,并使用我想要的格式重新分配这些对象。
"2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-16" "2018-03-12"
[10] "2017-07-20" "2018-06-07" "2018-03-15" "2018-03-06" "2017-10-19" NA               NA               NA
data_agg[[12]]
 [1] "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "Yes"   "Yes"   "N/A"   NA      NA      "17476" NA      NA      NA 
 [1] "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "N/A"   "Yes"   "Yes"   "N/A"   NA      NA      "2017-11-06" NA      NA      NA