这种日期转换最聪明的方法是什么?
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.Date
与 format
%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 日。
另一种方法是使用 sub
和 gsub
不测试日期是否有效:
gsub("\b(\d)\b", "0\1"
, sub("(\d+)/(\d+)/(\d+).*", "\3-\1-\2", "4/31/2022 8:26"))
#[1] "2022-04-31"
当我试图分析来自 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.Date
与 format
%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 日。
另一种方法是使用 sub
和 gsub
不测试日期是否有效:
gsub("\b(\d)\b", "0\1"
, sub("(\d+)/(\d+)/(\d+).*", "\3-\1-\2", "4/31/2022 8:26"))
#[1] "2022-04-31"