无法将字符转换为日期时间
Unable to convert character to Datetime
这不是重复的。我已经引用了这些帖子 ,2,3
我有如下数据框:
t_df <- data.frame("SN" = c("AabcC123","ABC123","ABC123","MNO098","MNO098","MNO098"),
"code" = c("ABC1111","DEF222","GHI133","","MNO1123","MNO567"),
"d_time" = c("21/12/2012 12:12","30/06/2019 11:11","20/02/2027 10:10","22/11/2327 09:09:11","5/2/1927 08:08:12",""))
t_df <- data.frame(lapply(t_df, as.character), stringsAsFactors=FALSE)
当我读取 csv 文件时,我所有的日期都是 character
类型。
因此,当我尝试对数据帧进行排序时,它只能根据第一个字符进行排序。
我想将其转换为 Datetime
格式。
虽然我根据上面链接的其他帖子尝试了以下选项,但没有任何帮助。它returnsNA
as_datetime(t_df$d_time, "%d/%m/%Y %H:%M:%S")
as.POSIXct(t_df$d_time,format="%d/%m/%Y %H:%M:%S")
dmy_hms(t_df$d_time)
你能帮我把数据类型转换成datetime
吗?
您必须将格式调整为数据中的格式,即 %d/%m/%Y
。
例如,在第一行中有 21/12/2012
,即 day/month/year
。
在 R 中,日的缩写是 %d
,月份的缩写是 %m
,四位数年份的缩写是 %Y
。中间的斜杠 /
指的是字符串中的斜杠。
因此
t_df <- data.frame("SN" = c("AabcC123","ABC123","ABC123","MNO098","MNO098","MNO098"),
"code" = c("ABC1111","DEF222","GHI133","","MNO1123","MNO567"),
"d_time" = c("21/12/2012","30/06/2019","20/02/2027","22/11/2327","5/2/1927",""),
stringsAsFactors = FALSE)
t_df$d_time <- as.POSIXct(t_df$d_time, format = "%d/%m/%Y")
请注意,大多数时候创建 data.frame 时,最好像我一样使用选项 stringsAsFactors = FALSE
。
一个想法是计算冒号(:
),如果只有1,则添加秒为:00
,即
library(stringr) #for str_count()
t_df$d_time[t_df$d_time != ''] <- ifelse(str_count(t_df$d_time[t_df$d_time != ''], ':') < 2,
paste0(t_df$d_time[t_df$d_time != ''], ':00'),
t_df$d_time[t_df$d_time != ''])
as.POSIXct(t_df$d_time, format = "%d/%m/%Y %H:%M:%S")
#[1] "2012-12-21 12:12:00 EET" "2019-06-30 11:11:00 +03" "2027-02-20 10:10:00 +03" "2327-11-22 09:09:11 +03" "1927-02-05 08:08:12 EET" NA
这不是重复的。我已经引用了这些帖子
我有如下数据框:
t_df <- data.frame("SN" = c("AabcC123","ABC123","ABC123","MNO098","MNO098","MNO098"),
"code" = c("ABC1111","DEF222","GHI133","","MNO1123","MNO567"),
"d_time" = c("21/12/2012 12:12","30/06/2019 11:11","20/02/2027 10:10","22/11/2327 09:09:11","5/2/1927 08:08:12",""))
t_df <- data.frame(lapply(t_df, as.character), stringsAsFactors=FALSE)
当我读取 csv 文件时,我所有的日期都是 character
类型。
因此,当我尝试对数据帧进行排序时,它只能根据第一个字符进行排序。
我想将其转换为 Datetime
格式。
虽然我根据上面链接的其他帖子尝试了以下选项,但没有任何帮助。它returnsNA
as_datetime(t_df$d_time, "%d/%m/%Y %H:%M:%S")
as.POSIXct(t_df$d_time,format="%d/%m/%Y %H:%M:%S")
dmy_hms(t_df$d_time)
你能帮我把数据类型转换成datetime
吗?
您必须将格式调整为数据中的格式,即 %d/%m/%Y
。
例如,在第一行中有 21/12/2012
,即 day/month/year
。
在 R 中,日的缩写是 %d
,月份的缩写是 %m
,四位数年份的缩写是 %Y
。中间的斜杠 /
指的是字符串中的斜杠。
因此
t_df <- data.frame("SN" = c("AabcC123","ABC123","ABC123","MNO098","MNO098","MNO098"),
"code" = c("ABC1111","DEF222","GHI133","","MNO1123","MNO567"),
"d_time" = c("21/12/2012","30/06/2019","20/02/2027","22/11/2327","5/2/1927",""),
stringsAsFactors = FALSE)
t_df$d_time <- as.POSIXct(t_df$d_time, format = "%d/%m/%Y")
请注意,大多数时候创建 data.frame 时,最好像我一样使用选项 stringsAsFactors = FALSE
。
一个想法是计算冒号(:
),如果只有1,则添加秒为:00
,即
library(stringr) #for str_count()
t_df$d_time[t_df$d_time != ''] <- ifelse(str_count(t_df$d_time[t_df$d_time != ''], ':') < 2,
paste0(t_df$d_time[t_df$d_time != ''], ':00'),
t_df$d_time[t_df$d_time != ''])
as.POSIXct(t_df$d_time, format = "%d/%m/%Y %H:%M:%S")
#[1] "2012-12-21 12:12:00 EET" "2019-06-30 11:11:00 +03" "2027-02-20 10:10:00 +03" "2327-11-22 09:09:11 +03" "1927-02-05 08:08:12 EET" NA