我想知道我是否错过了什么?
我想知道:是否有更好/更短的方式从datetime对象获取分钟:
目前学习的课程:
从润滑日期时间对象提取时间(HMS) ?
从HMS转换为小时:分钟,或者从HMS四舍五入到分钟
R:转换小时:分钟:秒
我的宠物猫:
df <- structure(list(dttm = structure(c(-2209068000, -2209069200, -2209061520,
-2209064100, -2209065240), tzone = "UTC", class = c("POSIXct",
"POSIXt"))), row.names = c(NA, -5L), class = c("tbl_df", "tbl",
"data.frame"))
# A tibble: 5 x 1
dttm
<dttm>
1 1899-12-31 02:00:00
2 1899-12-31 01:40:00
3 1899-12-31 03:48:00
4 1899-12-31 03:05:00
5 1899-12-31 02:46:00
我想添加一个新的列,分钟作为整数:
目前为止我的方法:
library(dplyr)
library(lubridate) # ymd_hms
library(hms) # as_hms
library(chron) # times
test %>%
mutate(dttm_min = as_hms(ymd_hms(dttm)),
dttm_min = 60*24*as.numeric(times(dttm_min)))
# A tibble: 5 x 2
dttm dttm_min
<dttm> <dbl>
1 1899-12-31 02:00:00 120
2 1899-12-31 01:40:00 100
3 1899-12-31 03:48:00 228
4 1899-12-31 03:05:00 185
5 1899-12-31 02:46:00 166
这给了我想要的结果,但是我需要3个包来完成这个操作。有没有更直接的方法?
这是一个基本的R方式-
您可以使用format
提取时间,将日期更改为'1970-01-01'
(因为R datetime以'1970-01-01'
开头),转换为数字并将时间除以60得到以分钟为单位的持续时间。
as.numeric(as.POSIXct(paste('1970-01-01', format(df$dttm, '%T')), tz = 'UTC'))/60
#[1] 120 100 228 185 166
有两种方法。
基地R
with(df, as.integer(format(dttm, "%M")) + 60*as.integer(format(dttm, "%H")))
#[1] 120 100 228 185 166
另一个基本R选项,在这里使用"POSIXlt"
类。
minute_of_day <- function(x){
y <- as.POSIXlt(x)
60*y$hour + y$min
}
minute_of_day(df$dttm)
#[1] 120 100 228 185 166
封装lubridate
lubridate::minute(df$dttm) + 60*lubridate::hour(df$dttm)
#[1] 120 100 228 185 166
如果包已加载,则可以简化为
,输出相同library(lubridate)
minute(df$dttm) + 60*hour(df$dttm)
我们可以使用
library(data.table)
as.numeric(as.ITime(format(df$dttm, '%T')))/60
[1] 120 100 228 185 166
为了完整起见,可以通过取POSIXct datetime对象与一天开始之间的difftime()
来计算一天的时间(以分钟为单位),例如
difftime(df$dttm, lubridate::floor_date(df$dttm, "day"), units = "min")
Time differences in mins [1] 120 100 228 185 166
除了基础R之外,只需要另外一个包。
根据help("difftime")
,difftime()
返回一个"类的对象;difftime
";带有指示单位的属性。