这种日期转换最聪明的方法是什么?

What is the smartest approach for this date-conversion?

当我试图分析来自 kaggle 的数据集时,我 运行 遇到了一些转换问题。我想从“2022 年 4 月 31 日 8:26”中检索“2022-04-31”的 ISO 日期。

我的第一个想法是通过循环和 if 逻辑的经典编程方法 - 负担不起。这里的问题是缺少前导零。

第二种方法是通过 str_split 分隔列字符串值,然后再次将它们转换在一起:

################################################################################
#                             START OF SCRIPT                                   
################################################################################

suppressPackageStartupMessages(library(tidyverse))
suppressPackageStartupMessages(library(lubridate))

################################################################################
#                                  ETL                                  
################################################################################

#---->> https://www.kaggle.com/carrie1/ecommerce-data
raw_data  <-  read.csv("data 2.csv", sep = ",")

clean_data <- raw_data %>% drop_na() 
clean_data <-  clean_data[!duplicated(clean_data[,1:8]),]

#
## date conversion
#

split <- str_split(clean_data$InvoiceDate, "/") %>%  plyr::ldply(,data.frame)
colnames(split) <- c("month", "day", "year")
split$year <- substr(split$year, 1,4) 

######
filled_day = as.Date(split$day, format = "%d")
str_day <- substr(filled_day, 9,10)

对于日期栏,它似乎是这样工作的,但我无法使用 base 和 lubridate 重新转换月份。也许我的方法太复杂或太简单。请与我分享你的想法

您可以将 as.Dateformat %m/%d/%Y 一起使用。

as.Date("4/30/2022 8:26", "%m/%d/%Y")
#[1] "2022-04-30"

但这仅适用于有效日期。

as.Date("4/31/2022 8:26", "%m/%d/%Y")
#[1] NA

因为没有 4 月 31 日。

另一种方法是使用 subgsub 不测试日期是否有效:

gsub("\b(\d)\b", "0\1"
    , sub("(\d+)/(\d+)/(\d+).*", "\3-\1-\2", "4/31/2022 8:26"))
#[1] "2022-04-31"