我有一个如下数据框:
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
格式。
尽管我根据上面链接的其他帖子尝试了以下选项,但没有任何帮助。它返回NA
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
吗?
答案 0 :(得分:2)
一个想法是计算冒号(:
),如果只有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
答案 1 :(得分:1)
您必须将格式调整为数据中的格式%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
。