R-在数据框中格式化日期-十进制和字符值的混合

时间:2020-01-02 06:07:09

标签: r lubridate openxlsx

我在数据框中有一个日期列。我已经使用openxlsx将这个df读入R。当我使用typeof(df$date)时,该列被视为字符向量。

该列包含几种格式的日期信息,我希望将其转换为一种格式。

#Example
date <- c("43469.494444444441", "12/31/2019 1:41 PM", "12/01/2019  16:00:00")

#What I want -updated
fixed <- c("2019-04-01", "2019-12-31", "2019-12-01")

我尝试了许多解决方法,包括openxlsx::ConvertToDatelubridate::parse_date_timelubridate::date_decimal

openxlsx::ConvertToDate到目前为止效果最好,但仅会采用一种格式并强制使用其他格式的NA

更新

我意识到我实际上有一个以上输出日期错误。 值43469.494444444441应转换为2019-04-01。

2 个答案:

答案 0 :(得分:2)

这是分两步执行此操作的一种方法。分别更改excel日期,并更改所有其他日期。如果您可以在<script> function openPopup() { document.getElementById("boxPopup").style.display = "block"; } function closePopup() { document.getElementById("boxPopup").style.display = "none"; } // When the user clicks anywhere outside of the modal, close it window.onclick = function (event) { var modal = document.getElementById('boxPopup'); if (event.target == modal) { closePopup(); } } </script> 中添加更多日期格式。

parse_date_time

答案 1 :(得分:1)

您可以使用助手功能对日期进行规范化,该日期可能比lubridate快一点。

weird origins in MS Excel个取决于平台。因此,如果数据是从不同的平台导入的,则可能需要使用虚拟变量。

normDate <- Vectorize(function(x) {
if (!is.na(suppressWarnings(as.numeric(x))))  # Win excel
  as.Date(as.numeric(x), origin="1899-12-30")
else if (grepl("A|P", x))
  as.Date(x, format="%m/%d/%Y %I:%M %p")
else
  as.Date(x, format="%m/%d/%Y %R")
})

对于其他日期格式,只需添加另一个else if。格式规范可以在?strptime中找到。

然后只需使用as.Date()(具有通常的来源)即可。

res <- as.Date(normDate(date), origin="1970-01-01")
# 43469.494444444441   12/31/2019 1:41 PM 12/01/2019  16:00:00 
#       "2019-01-04"         "2019-12-31"         "2019-12-01"
class(res)
# [1] "Date"

编辑: :要获得特定的输出格式,请使用format,例如

format(res, "%Y-%d-%m")
# 43469.494444444441   12/31/2019 1:41 PM 12/01/2019  16:00:00 
#       "2019-04-01"         "2019-31-12"         "2019-01-12" 

format(res, "%Y/%d/%m")
# 43469.494444444441   12/31/2019 1:41 PM 12/01/2019  16:00:00 
#       "2019/04/01"         "2019/31/12"         "2019/01/12" 

要查找代码,请输入?strptime