首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将1列时间划分为数据和时间

如何将1列时间划分为数据和时间
EN

Stack Overflow用户
提问于 2022-02-01 05:19:36
回答 2查看 68关注 0票数 1

我很抱歉(我是全新的),因为我知道这已经发布了一百万次,但我想了解的不仅是答案,而且我应该使用哪种方法作为最佳实践。我已经点击了10+链接来说明如何做到这一点,但是我似乎在数据上搞砸了。

我的heartrate_seconds.csv中有3列数据(ID、日期、值),我的日期列包括我想分开的时间和日期(Ex: 4/12/2016 7:22:50 AM)

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

代码语言:javascript
复制
heartrate_timeanddate <- heartrate_seconds %>% 
  mutate(Time = as.character(Time)) %>% 
  separate(Time, into = c("Date", "Time"), sep = " ") %>% 
  mutate(Time = as.Date(Date))

但是,这会导致我新添加的Time列作为日期,如何更改它?

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

代码语言:javascript
复制
heartrate_seconds_Time <- separate(heartrate_seconds = df, col = Time, into = c('Date, Time'), sep = ' ')
代码语言:javascript
复制
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")
代码语言:javascript
复制
heartrate_seconds %>% 
  separate(Time, into = c('Date, Time'), sep = '\\\\') %>% 
  select(Date, Time)

我觉得我不正确地使用了其他人的方法,这让我陷入了更深层次的困惑。所以我来寻求澄清。非常感谢!

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-01 08:39:02

在您的例子中,我将使用separatelubridate包。

tidyr::separate

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

代码语言:javascript
复制
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轻松地将列转换为datetime对象。然后使用dateformat创建新变量。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2022-02-01 06:05:36

一个简单的选择是像以前一样使用separate,但是用另一个字符替换第一个空格,然后分开。

代码语言:javascript
复制
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"))

输出

代码语言:javascript
复制
                  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

数据

代码语言:javascript
复制
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转换为类日期的变量。然后,对于时间变量,我们可以使用格式将时间分量提取为字符串。

代码语言:javascript
复制
df$Date <- as.Date(df$date)
df$Time <- format(as.POSIXct(df$date), format = "%H:%M:%S")

输出

代码语言:javascript
复制
                  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

数据

代码语言:javascript
复制
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"))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70935870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档