使用应用函数将选定列从 POSIXct 转换为具有特定格式的日期
Converting selected columns from POSIXct to Date with particular format using apply function
偶尔,我将来自 Microsoft Excel 的数据读入 R。在 Excel 中,日期变量的格式正确(例如 31-Dec-2017)。在读入 R 之后,相同的日期变量被转换为另一种格式(例如 2017-12-31)。
我的数据框样本(读入 R 后)如下所示:
df <- structure(list(ID = c("001", "002", "003", "004", "005"),
t1_date = structure(c(1490227200, 1508198400, 1511395200, 1527292800, 1485216000),
class = c("POSIXct", "POSIXt"), tzone = "UTC"),
t2_date = structure(c(1524009600, NA, NA, NA, 1523232000),
class = c("POSIXct", "POSIXt"), tzone = "UTC"),
t3_date = c(NA, NA, NA, NA, NA),
t4_date = c(NA, NA, NA, NA, NA),
t5_date = c(NA, NA, NA, NA, NA)),
.Names = c("ID", "t1_date", "t2_date", "t3_date", "t4_date", "t5_date"),
row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"))
以 t1_date 变量为例,我可以将每个日期列从 POSIXct class(对我来说是 R selects)单独转换为日期 class 然后使用以下代码更改格式:
df$t1_date <- as.Date(df$t1_date)
df$t1_date <- format(df$t1_date, "%d-%b-%Y")
但是,我有很多日期列,它们在数据框中可能不相邻。
通常,为了解决此类问题,我使用 which
和 apply
函数来 select 相关列并将函数应用于它们:
df[, which(colnames(df) == "t1_date"):
which(colnames(df) == "t5_date")] <-
apply(df[, which(colnames(df) == "t1_date"):
which(colnames(df) == "t5_date")], 2, function(x) as.Date(x, format = "%d-%b-%Y"))
以上代码导致所有日期列中出现 NA,我不确定原因。即使我不强制更改格式,而是将日期列从 POSIXct class 转换为日期 class,代码仍然不起作用(见下文):
df[, which(colnames(df) == "t1_date"):
which(colnames(df) == "t5_date")] <-
apply(df[, which(colnames(df) == "t1_date"):
which(colnames(df) == "t5_date")], 2, as.Date)
我想要的结果是将日期转换为 DD-MMM-YYYY 格式(例如 31-Dec-2017)。
感谢帮助。谢谢!
我们 select 我们想要格式化的列范围,然后使用 as.Date
将它们转换为日期,然后根据我们的要求 format
它。
start_col <- which(colnames(df) == "t1_date")
end_col <- which(colnames(df) == "t5_date")
df[start_col:end_col] <- lapply(df[start_col:end_col],
function(x) format(as.Date(x), "%d-%b-%Y"))
df
# A tibble: 5 x 6
# ID t1_date t2_date t3_date t4_date t5_date
# <chr> <chr> <chr> <chr> <chr> <chr>
#1 001 23-Mar-2017 18-Apr-2018 NA NA NA
#2 002 17-Oct-2017 NA NA NA NA
#3 003 23-Nov-2017 NA NA NA NA
#4 004 26-May-2018 NA NA NA NA
#5 005 24-Jan-2017 09-Apr-2018 NA NA NA
同样可以用 dplyr
, mutate_at
来实现
library(dplyr)
df %>%
mutate_at(vars("t1_date":"t5_date"), funs(format(as.Date(.), "%d-%b-%Y")))
# ID t1_date t2_date t3_date t4_date t5_date
# <chr> <chr> <chr> <chr> <chr> <chr>
#1 001 23-Mar-2017 18-Apr-2018 NA NA NA
#2 002 17-Oct-2017 NA NA NA NA
#3 003 23-Nov-2017 NA NA NA NA
#4 004 26-May-2018 NA NA NA NA
#5 005 24-Jan-2017 09-Apr-2018 NA NA NA
偶尔,我将来自 Microsoft Excel 的数据读入 R。在 Excel 中,日期变量的格式正确(例如 31-Dec-2017)。在读入 R 之后,相同的日期变量被转换为另一种格式(例如 2017-12-31)。
我的数据框样本(读入 R 后)如下所示:
df <- structure(list(ID = c("001", "002", "003", "004", "005"),
t1_date = structure(c(1490227200, 1508198400, 1511395200, 1527292800, 1485216000),
class = c("POSIXct", "POSIXt"), tzone = "UTC"),
t2_date = structure(c(1524009600, NA, NA, NA, 1523232000),
class = c("POSIXct", "POSIXt"), tzone = "UTC"),
t3_date = c(NA, NA, NA, NA, NA),
t4_date = c(NA, NA, NA, NA, NA),
t5_date = c(NA, NA, NA, NA, NA)),
.Names = c("ID", "t1_date", "t2_date", "t3_date", "t4_date", "t5_date"),
row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"))
以 t1_date 变量为例,我可以将每个日期列从 POSIXct class(对我来说是 R selects)单独转换为日期 class 然后使用以下代码更改格式:
df$t1_date <- as.Date(df$t1_date)
df$t1_date <- format(df$t1_date, "%d-%b-%Y")
但是,我有很多日期列,它们在数据框中可能不相邻。
通常,为了解决此类问题,我使用 which
和 apply
函数来 select 相关列并将函数应用于它们:
df[, which(colnames(df) == "t1_date"):
which(colnames(df) == "t5_date")] <-
apply(df[, which(colnames(df) == "t1_date"):
which(colnames(df) == "t5_date")], 2, function(x) as.Date(x, format = "%d-%b-%Y"))
以上代码导致所有日期列中出现 NA,我不确定原因。即使我不强制更改格式,而是将日期列从 POSIXct class 转换为日期 class,代码仍然不起作用(见下文):
df[, which(colnames(df) == "t1_date"):
which(colnames(df) == "t5_date")] <-
apply(df[, which(colnames(df) == "t1_date"):
which(colnames(df) == "t5_date")], 2, as.Date)
我想要的结果是将日期转换为 DD-MMM-YYYY 格式(例如 31-Dec-2017)。
感谢帮助。谢谢!
我们 select 我们想要格式化的列范围,然后使用 as.Date
将它们转换为日期,然后根据我们的要求 format
它。
start_col <- which(colnames(df) == "t1_date")
end_col <- which(colnames(df) == "t5_date")
df[start_col:end_col] <- lapply(df[start_col:end_col],
function(x) format(as.Date(x), "%d-%b-%Y"))
df
# A tibble: 5 x 6
# ID t1_date t2_date t3_date t4_date t5_date
# <chr> <chr> <chr> <chr> <chr> <chr>
#1 001 23-Mar-2017 18-Apr-2018 NA NA NA
#2 002 17-Oct-2017 NA NA NA NA
#3 003 23-Nov-2017 NA NA NA NA
#4 004 26-May-2018 NA NA NA NA
#5 005 24-Jan-2017 09-Apr-2018 NA NA NA
同样可以用 dplyr
, mutate_at
library(dplyr)
df %>%
mutate_at(vars("t1_date":"t5_date"), funs(format(as.Date(.), "%d-%b-%Y")))
# ID t1_date t2_date t3_date t4_date t5_date
# <chr> <chr> <chr> <chr> <chr> <chr>
#1 001 23-Mar-2017 18-Apr-2018 NA NA NA
#2 002 17-Oct-2017 NA NA NA NA
#3 003 23-Nov-2017 NA NA NA NA
#4 004 26-May-2018 NA NA NA NA
#5 005 24-Jan-2017 09-Apr-2018 NA NA NA