在 R 中单独使用日期和时间

Separate date and time in R

提问人:sehne 提问时间:7/13/2023 最后编辑:sehne 更新时间:8/14/2023 访问量:45

问:

我有一个数据集,其中的列由日期和时间组成为“字符”类(列“有效”。我想将此列分为两列,一列用于日期,一列用于时间。但值应该保留(而不是改变)。 这是从 head(data, 10) 获得的数据的前 10 个输出

> head(data, 10)
   station            valid speed
1     PHNL 2021-01-01 00:00 14.95
2     PHNL 2021-01-01 00:05 21.85
3     PHNL 2021-01-01 00:10 17.25
4     PHNL 2021-01-01 00:15 19.55
5     PHNL 2021-01-01 00:20 16.10
6     PHNL 2021-01-01 00:25 17.25
7     PHNL 2021-01-01 00:30 12.65
8     PHNL 2021-01-01 00:35 17.25
9     PHNL 2021-01-01 00:40 18.40
10    PHNL 2021-01-01 00:45 17.25

我用作为。POSIXct 和我得到了预期的日期结果,但时间列只是 00:00,这意味着时间没有像原始列中那样更新。我应该如何解决这个问题?请提前帮助和感谢。

data$date=as.Date(data$valid) 
data$time=format(as.POSIXct(data$valid),
                 format="%H:%M")

结果

  station            valid speed       date  time
1    PHNL 2021-01-01 00:00 14.95 2021-01-01 00:00
2    PHNL 2021-01-01 00:05 21.85 2021-01-01 00:00
3    PHNL 2021-01-01 00:10 17.25 2021-01-01 00:00
4    PHNL 2021-01-01 00:15 19.55 2021-01-01 00:00
5    PHNL 2021-01-01 00:20 16.10 2021-01-01 00:00
6    PHNL 2021-01-01 00:25 17.25 2021-01-01 00:00
r time datetime-format 润滑剂

评论

2赞 Allan Cameron 7/13/2023
我无法重现这个。使用指定格式的数据,我按预期获得列 - 00:00、00:05、00:10 等time
0赞 Carlos M. 7/13/2023
现在没有时间制作 reprex。但考虑一下。Date(),然后从日期(始终为 00:00)中减去原始值。根据定义,这种差异就是时间,因为它总是从午夜开始的时间!
0赞 Allan Cameron 7/13/2023
@CarlosM。这将为您提供一个整数秒数,因此您将面临将其转换为 HH:MM 格式的问题。更好的选择可能是data$time <- sub('^.+ (.*)$', '\\1', data$valid)
0赞 Carlos M. 7/13/2023
正则表达式有效,我个人只会使用整数秒并仅在需要时进行转换,以便数学仍然适用(例如,time1 > time2),这就是 lubridate、zoo 等无论如何进行比较的方式(视为整数)。
0赞 sehne 7/13/2023
@Allan Cameron 实际上,这是日内数据,我们每天有 5 分钟的观察,从凌晨 0 点开始,每天观察到 23:55,整个 2021 年。所以我在想,也许,原始文件中记录时间的方式不是“实际”时间,而是从 0 开始制作 5 分钟数据的方式?如果我的猜测是正确的,我如何使用相同的“时间”列提取它?

答:

0赞 Mark 8/14/2023 #1

以下是几种方法:

# load libraries
pacman::p_load(tidyverse, hms)

# create it as a tibble, so we can see the column types
read.table(text =
"    station            valid speed
1     PHNL '2021-01-01 00:00' 14.95
2     PHNL '2021-01-01 00:05' 21.85
3     PHNL '2021-01-01 00:10' 17.25
4     PHNL '2021-01-01 00:15' 19.55
5     PHNL '2021-01-01 00:20' 16.10
6     PHNL '2021-01-01 00:25' 17.25
7     PHNL '2021-01-01 00:30' 12.65
8     PHNL '2021-01-01 00:35' 17.25
9     PHNL '2021-01-01 00:40' 18.40
10    PHNL '2021-01-01 00:45' 17.25", header = TRUE) |> as_tibble() -> df

mutate(df, valid = as.POSIXct(valid, format = "%Y-%m-%d %H:%M"),
           date = as.Date(valid), 
           time = format(valid, "%H:%M"))

# or
mutate(df, valid = as_datetime(valid, format = "%Y-%m-%d %H:%M"),
              date = as_date(valid), 
              time = as_hms(format(valid, "%H:%M:%S")))

输出:

# A tibble: 10 × 5
   station valid               speed date       time  
   <chr>   <dttm>              <dbl> <date>     <time>
 1 PHNL    2021-01-01 00:00:00  15.0 2021-01-01 00'00"
 2 PHNL    2021-01-01 00:05:00  21.8 2021-01-01 05'00"
 3 PHNL    2021-01-01 00:10:00  17.2 2021-01-01 10'00"
 4 PHNL    2021-01-01 00:15:00  19.6 2021-01-01 15'00"
 5 PHNL    2021-01-01 00:20:00  16.1 2021-01-01 20'00"
 6 PHNL    2021-01-01 00:25:00  17.2 2021-01-01 25'00"
 7 PHNL    2021-01-01 00:30:00  12.6 2021-01-01 30'00"
 8 PHNL    2021-01-01 00:35:00  17.2 2021-01-01 35'00"
 9 PHNL    2021-01-01 00:40:00  18.4 2021-01-01 40'00"
10 PHNL    2021-01-01 00:45:00  17.2 2021-01-01 45'00"

如果您有任何问题,请随时发表评论!