我有一系列的时间戳,我想要创建一个新的变量,其中的值在上午9点后有一个小时值,然后更改为第二天的日期。如果是在上午9点之前,日期将保持不变。
2018-5-11 01:57:00 would remain 2018-05-11
2018-5-11 11:15:00 would change to 2018-5-12发布于 2018-12-03 22:16:45
但是,这个解决方案可以回答您的问题,但是,考虑编写代码以避免原始数据发生变异是值得的;为随后的聚合/修改而设计/提取新变量(例如,一天中的小时、“上午9点后或没有”等)可能会使开发和代码修改变得更容易(特别是在脚本结束和开始之间来回来回的情况下)。
timestamps <- as.POSIXct(c('2018-5-11 01:57:00','2018-5-11 11:15:00'), "%Y-%m-%d %H:%M:%S")
mask <- as.integer(format(timestamps, "%H")) > 9
timestamps <- as.Date(timestamps)
timestamps[mask] <- timestamps[mask] + 1
timestamps
[1] "2018-05-11" "2018-05-12"发布于 2018-12-03 22:15:21
library(lubridate)
library(data.table)
setDT(df)
df$timestamp_cast <- ymd_hms(df$yourtimestamp_col)
df$desired_col <- NA
df[hour(timestamp_cast) < 9, desired_col := as.Date(timestamp_cast)]
df[hour(timestamp_cast) >= 9, desired_col := as.Date(timestamp_cast)+1]发布于 2018-12-03 22:41:57
答案取决于您的时间戳是如何存储的,但是让我们假设它们是"POSIXct" "POSIXt"类型的,比如lubridate::ymd_hms创建的。
然后我们可以使用lubridate和dplyr。注意使用dplyr::if_else防止将日期转换为数字。
library(lubridate)
library(dplyr)
data.frame(dttm = ymd_hms(c("2018-5-11 11:15:00",
"2018-5-11 01:57:00"))) %>%
mutate(hr = hour(dttm),
dt = if_else(hr > 9, as_date(dttm + days(1)), as_date(dttm)))结果:
dttm hr dt
1 2018-05-11 11:15:00 11 2018-05-12
2 2018-05-11 01:57:00 1 2018-05-11https://stackoverflow.com/questions/53602720
复制相似问题