R 日期时间转换

3
我刚学习R语言,我有一个数据框,其中包含日期时间变量。每天记录一小时的温度,日期时间格式为YYYY-MM-DD 00:00:00。现在我想将时间转换为范围从0到23的因子,每天一个因子。因此,对于每一天,我的新列应该有0到23个因子。谁能帮我解决这个问题?我的2015-01-01 00:00:00应该给我0,而2015-01-01 01:00:00应该给我1,依此类推。另外,我的2015-01-02 00:00:00应该再次是0。
4个回答

4
你可以将时间戳转换为POSIXlt对象。一旦你有了它,你就可以直接获取小时数,方法如下:
> timestamp <- as.POSIXlt("2015-01-01 00:00:00")
> timestamp
[1] "2015-01-01 MYT"
> timestamp$hour
[1] 0

1

@Sairam,除了@jazzurro使用的'dplyr'(像jazzurro一样,许多R-insitas经常使用)之外...如果您需要/想要一种简单而强大的方式来操作日期,请鼓励您熟悉另一个软件包:'lubridate.'

lubridate使处理日期变得轻松。希望这可以帮助您的项目。最好的祝愿。


1
使用样本数据,一种方法是以下方式。
mydf <- data.frame(id = c(1,1,1,2,2,1,1),
                   event = c("start", "valid", "end", "start", "bad", "start", "bad"),
                   time = as.POSIXct(c("2015-05-16 20:46:53", "2015-05-16 20:46:56", "2015-05-16 21:46:59",
                                   "2015-05-16 22:46:53", "2015-05-16 22:47:00", "2015-05-16 22:49:05",
                                   "2015-05-16 23:49:09"), format = "%Y-%m-%d %H:%M:%S"),
                   stringsAsFactors = FALSE)

library(dplyr)
mutate(mydf, group = factor(format(time, "%H")))

#  id event                time group
#1  1 start 2015-05-16 20:46:53    20
#2  1 valid 2015-05-16 20:46:56    20
#3  1   end 2015-05-16 21:46:59    21
#4  2 start 2015-05-16 22:46:53    22
#5  2   bad 2015-05-16 22:47:00    22
#6  1 start 2015-05-16 22:49:05    22
#7  1   bad 2015-05-16 23:49:09    23

1
为什么要加载 dplyr 来添加一个变量? - thelatemail
@thelatemail,你不必这样做。默认情况下,我已经在我的计算机上运行dplyr并使用它了。 :) - jazzurro
@SairamReddy 不用谢。我很高兴这对你有帮助。 :) - jazzurro
1
另外,hour(mydf$time) - akrun
@akrun 谢谢你。这样更好。 :) - jazzurro

1

使用POSIXlt的Tim的答案可能是最好的选择,但以下是一种正则表达式的方式:

> times <- c("2015-01-01 00:00:00", "2015-01-01 01:00:00", "2015-01-02 00:00:00")
> regmatches(times, regexpr("(?<=-\\d{2} )\\d{2}", times, perl=TRUE))
[1] "00" "01" "00"

通过提取的小时数,您可以根据需要将它们转换为因子或整数。


非常好的替代方案! - Tim Biegeleisen
1
正则表达式对于这个任务来说有些过头了 - 小时总是相同的两个字符,因此使用子字符串函数 - substr(times,12,13) - thelatemail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接