r-如何将我的1列时间分为数据和时间

  • 本文关键字:时间 数据 1列 r date
  • 更新时间 :
  • 英文 :


我很抱歉(我是全新的(,据我所知,这篇文章已经发布了一百万次,但我不仅想了解答案,还想了解我应该使用哪种方法作为最佳实践。我已经点击了10多个关于如何做到这一点的链接,但我似乎在数据上搞砸了。

我的heartrate_seconds.csv中有3列数据(ID、日期、值(,我的日期列由我想分开的时间和日期组成(例如:2016年4月12日上午7:22:50(

到目前为止,我最接近的是使用

heartrate_timeanddate <- heartrate_seconds %>% 
mutate(Time = as.character(Time)) %>% 
separate(Time, into = c("Date", "Time"), sep = " ") %>% 
mutate(Time = as.Date(Date))

但这会导致我新添加的"时间"列成为日期,我该如何更改?

我尝试过的其他方法很早就失败了:

heartrate_seconds_Time <- separate(heartrate_seconds = df, col = Time, into = c('Date, Time'), sep = ' ')
heartrate_time <- data.frame(heartrate_seconds, Time = c('Date','Time'))
heartrate_time$date <- as.Date(heartrate_time$all)
heartrate_time$date <- format(as.Date(heartrate_time$all), format ="%H:%M:%S")
heartrate_seconds %>% 
separate(Time, into = c('Date, Time'), sep = '\\') %>% 
select(Date, Time)

我觉得我错误地使用了其他帖子中的其他人的方法,这让我陷入了进一步的困惑。所以我是来寻求澄清的。非常感谢!

所有这些都是因为我无法将.csv导入SQL,我可能已经在架构中修复了这一问题,但我想一次只能修复一件事。

在您的情况下,我将使用separatelubridate包。

tidyr::separate

tidyr::separate与参数extra = "merge"一起使用。这意味着,如果在into中包含较少的列,则剩余信息将保留在最后一列中。在这里,这意味着您可以使用它来获得两个具有分隔符" "的列。

library(dplyr)
library(tidyr)
df %>% 
separate(date, into = c("Date","Time"), extra = "merge", sep = " ")
Date       Time
1 4/12/2016 7:22:50 AM
2 6/12/2016 7:22:50 PM

lubridate

使用lubridate包,您可以使用dmy_hms轻松地将列转换为日期时间对象。然后使用dateformat创建新的变量。

library(lubridate)
library(dplyr)
df %>% 
mutate(date = dmy_hms(date),
Date = date(date),
Time = format(date, format = "%H:%M:%S"))
date       Date     Time
1 2016-12-04 07:22:50 2016-12-04 07:22:50
2 2016-12-06 19:22:50 2016-12-06 19:22:50

一个简单的选项是使用separate,但用另一个字符替换第一个空格,然后将其分隔开。

library(tidyverse)
df %>% 
mutate(col = str_replace(date, "\s", "|")) %>% 
separate(col, into = c("Date", "Time"), sep = "\|") %>% 
mutate(Date = as.Date(Date, format="%d/%m/%Y"))

输出

date       Date       Time
1 4/12/2016 7:22:50 AM 2016-12-04 7:22:50 AM
2 6/12/2016 7:22:50 PM 2016-12-06 7:22:50 PM

数据

df <-
structure(list(date = c(
"4/12/2016 7:22:50 AM", "6/12/2016 7:22:50 PM"
)),
class = "data.frame",
row.names = c(NA,-2L))

另一个选项是使用as.Datedate转换为Date类的变量。然后,对于时间变量,我们可以使用format将时间分量提取为字符串。

df$Date <- as.Date(df$date)
df$Time <- format(as.POSIXct(df$date), format = "%H:%M:%S")

输出

date       Date     Time
1  2021-05-28 07:16:52 2021-05-28 07:16:52
2  2021-05-30 13:35:00 2021-05-30 13:35:00
3  2021-05-30 14:22:55 2021-05-30 14:22:55
4  2021-05-28 06:51:51 2021-05-28 06:51:51
5  2021-05-30 13:31:55 2021-05-30 13:31:55
6  2021-05-30 13:33:38 2021-05-30 13:33:38
7  2021-05-30 13:35:51 2021-05-30 13:35:51
8  2021-05-30 13:38:44 2021-05-30 13:38:44
9  2021-05-30 13:51:19 2021-05-30 13:51:19
10 2021-05-30 14:04:53 2021-05-30 14:04:53

数据

df <- structure(list(date = structure(c(1622186212, 1622381700, 1622384575, 
1622184711, 1622381515, 1622381618, 1622381751, 1622381924, 1622382679, 
1622383493), 
tzone = "UTC", class = c("POSIXct", "POSIXt"))), 
row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))

相关内容

  • 没有找到相关文章

最新更新