我在数据框中有一个日期列。我已经使用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::ConvertToDate
,lubridate::parse_date_time
,lubridate::date_decimal
openxlsx::ConvertToDate
到目前为止效果最好,但仅会采用一种格式并强制使用其他格式的NA
更新
我意识到我实际上有一个以上输出日期错误。 值43469.494444444441应转换为2019-04-01。
答案 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
。