12

我在 data.frame 中有一个 DateTime 向量,其中数据框由 8760 个观测值组成,代表全年的每小时间隔,例如

2010-01-01 00:00
2010-01-01 01:00
2010-01-01 02:00
2010-01-01 03:00

等等。

我想创建一个 data.frame ,它的第一列是原始的 DateTime 向量,然后是第二列中的每小时值,例如

2010-01-01 00:00          00:00
2010-01-01 01:00          01:00

如何做到这一点?

4

4 回答 4

13

使用formatstrptime提取时间信息。

创建一个 POSIXct 向量:

x <- seq(as.POSIXct("2012-05-21"), by=("+1 hour"), length.out=5)

提取时间:

data.frame(
  date=x,
  time=format(x, "%H:%M")
)

                 date  time
1 2012-05-21 00:00:00 00:00
2 2012-05-21 01:00:00 01:00
3 2012-05-21 02:00:00 02:00
4 2012-05-21 03:00:00 03:00
5 2012-05-21 04:00:00 04:00

如果输入向量是字符向量,则必须先转换为 POSIXct:

创建一些数据

dat <- data.frame(
  DateTime=format(seq(as.POSIXct("2012-05-21"), by=("+1 hour"), length.out=5), format="%Y-%m-%d %H:%M")
)
dat
          DateTime
1 2012-05-21 00:00
2 2012-05-21 01:00
3 2012-05-21 02:00
4 2012-05-21 03:00
5 2012-05-21 04:00

拆分超时:

data.frame(
  DateTime=dat$DateTime,
  time=format(as.POSIXct(dat$DateTime, format="%Y-%m-%d %H:%M"), format="%H:%M")
)

          DateTime  time
1 2012-05-21 00:00 00:00
2 2012-05-21 01:00 01:00
3 2012-05-21 02:00 02:00
4 2012-05-21 03:00 03:00
5 2012-05-21 04:00 04:00
于 2012-05-21T10:20:51.117 回答
3

或者一般来说,不将它们视为日期,您可以使用以下内容,前提是正确填充时间和日期。

library(stringr)
df <- data.frame(DateTime = c("2010-01-01 00:00", "2010-01-01 01:00", "2010-01-01 02:00", "2010-01-01 03:00"))
df <- data.frame(df, Time = str_sub(df$DateTime, -5, -1))

这真的取决于你的需求。

于 2012-05-21T10:24:41.053 回答
3

使用lubridate

library(stringr)
library(lubridate)
library(plyr)

df <- data.frame(DateTime = c("2010-01-01 00:00", "2010-01-01 01:00", "2010-01-01 02:00", "2010-01-01 03:00"))

df <- mutate(df, DateTime = ymd_hm(DateTime),
                 time  = str_c(hour(DateTime), str_pad(minute(DateTime), 2, side = 'right', pad = '0'), sep = ':'))
于 2012-05-23T02:42:00.313 回答
0

在更一般的说明中,对于从谷歌来到这里并且可能想要按小时分组的任何人:

这里的关键是:lubridate::hour(datetime)

p22 在 cran 文档中:https ://cran.r-project.org/web/packages/lubridate/lubridate.pdf

于 2017-12-07T15:54:53.483 回答