我很抱歉(我是全新的(,据我所知,这篇文章已经发布了一百万次,但我不仅想了解答案,还想了解我应该使用哪种方法作为最佳实践。我已经点击了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,我可能已经在架构中修复了这一问题,但我想一次只能修复一件事。
在您的情况下,我将使用separate
或lubridate
包。
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
轻松地将列转换为日期时间对象。然后使用date
和format
创建新的变量。
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.Date
将date
转换为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"))