Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R帮助转换日期时间_R_Datetime_Lubridate - Fatal编程技术网

R帮助转换日期时间

R帮助转换日期时间,r,datetime,lubridate,R,Datetime,Lubridate,您好,我在df中有以下列,希望将它们转换为相同类型的日期格式。这样我就可以创建一个新的col Duration,其中需要“End.Date.Time”-“Start.Date.Time”: End.Date.Time Start.Date.Time 1/5/2018 12:14 20171125 1/5/2018 12:14 20171125 1/5/2018 12:14 20171125 30/5/2017 22:47 20170502 30/5/2017 22:47

您好,我在df中有以下列,希望将它们转换为相同类型的日期格式。这样我就可以创建一个新的col Duration,其中需要“End.Date.Time”-“Start.Date.Time”:

End.Date.Time    Start.Date.Time
1/5/2018 12:14   20171125 
1/5/2018 12:14   20171125 
1/5/2018 12:14   20171125 
30/5/2017 22:47  20170502
30/5/2017 22:47  20170502
30/5/2017 22:47  20170502
我试过了

library(lubridate)
df %>% mutate(End.Date.Time = ymd_hms(End.Date.Time), Start.Date.Time = ymd_hms(Start.Date.Time))

out: All formats failed to parse. No formats found.
“Start.Date.Time”值都变为NA。
我该如何解决这个问题呢?

基本的解决方法是

transform(df, 
   End.Date.Time  = as.POSIXct(End.Date.Time, format = "%d/%m/%Y %H:%M"), 
   Start.Date.Time = as.POSIXct(as.character(Start.Date.Time), format = "%Y%m%d"))

#        End.Date.Time Start.Date.Time
#1 2018-05-01 12:14:00      2017-11-25
#2 2018-05-01 12:14:00      2017-11-25
#3 2018-05-01 12:14:00      2017-11-25
#4 2017-05-30 22:47:00      2017-05-02
#5 2017-05-30 22:47:00      2017-05-02
#6 2017-05-30 22:47:00      2017-05-02
或者,如果您希望两列都作为日期,您可以这样做

transform(df, 
  End.Date.Time  = as.Date(as.POSIXct(End.Date.Time, format = "%d/%m/%Y %H:%M")), 
  Start.Date.Time = as.Date(as.character(Start.Date.Time), format = "%Y%m%d"))

使用
lubridate
,我们可以使用函数
dmy\u hm
ymd
进行转换

library(dplyr)
library(lubridate)

df %>% 
   mutate(End.Date.Time = dmy_hm(End.Date.Time), 
          Start.Date.Time = as.POSIXct(ymd(Start.Date.Time)))
数据

df <- structure(list(End.Date.Time = structure(c(1L, 1L, 1L, 2L, 2L, 
2L), .Label = c("1/5/2018 12:14", "30/5/2017 22:47"), class = "factor"), 
Start.Date.Time = c(20171125L, 20171125L, 20171125L, 20170502L, 
20170502L, 20170502L)), class = "data.frame", row.names = c(NA, -6L))

df如果您想坚持使用lubridate,下面的代码应该会有所帮助

df = structure(list(End.Date.Time = c("1/5/2018 12:14", "1/5/2018 12:14", 
                                  "1/5/2018 12:14", "30/5/2017 22:47", 
                                  "30/5/2017 22:47", "30/5/2017 22:47"), 
                Start.Date.Time = c(20171125L, 20171125L, 20171125L, 20170502L, 
                                    20170502L, 20170502L)), 
                .Names = c("End.Date.Time", "Start.Date.Time"), 
                row.names = c(NA, -6L), class = "data.frame")


df %>% 
  mutate(End.Date.Time = dmy_hm(End.Date.Time) %>% date, #dmy_hm outputs datetime. 
         Start.Date.Time = ymd(Start.Date.Time))
和。日期与基地也应该工作

df %>% 
  mutate(End.Date.Time = dmy_hm(End.Date.Time) %>% as.Date, 
         Start.Date.Time = ymd(Start.Date.Time))

大家好,非常感谢你们的解决方案。我做了以下工作,得到了我所需要的:

df$Duration <- as.Date((ymd_hms(df$End.Date.Time))) - (ymd(df$Start.Date.Time))

df$Duration您还可以
Map
将每个列映射为输出格式-
dat[]当我尝试您的建议时,我会得到End.Date.Time的NA值。@spidermarn使用我帖子中的数据,在我这边效果很好。你能用你的数据更新你的帖子吗
dput(df)
dput(head(df))
如果太长?当我尝试您的建议时,我会得到End.Date.Time的NA值。再次检查并运行。所以我不知道为什么<代码>日期
与其他软件包发生冲突?您可以尝试
%%>%lubridate::date()
您也可以尝试使用基本系统中的as.date<代码>df%>%变异(End.Date.Time=as.Date(dmy_-hm(End.Date.Time))%>%as.Date,Start.Date.Time=ymd(Start.Date.Time))