首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以小时为基础的时间戳更改日期

以小时为基础的时间戳更改日期
EN

Stack Overflow用户
提问于 2018-12-03 22:11:12
回答 3查看 451关注 0票数 0

我有一系列的时间戳,我想要创建一个新的变量,其中的值在上午9点后有一个小时值,然后更改为第二天的日期。如果是在上午9点之前,日期将保持不变。

代码语言:javascript
复制
2018-5-11 01:57:00  would remain 2018-05-11
2018-5-11 11:15:00  would change to 2018-5-12
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-03 22:16:45

但是,这个解决方案可以回答您的问题,但是,考虑编写代码以避免原始数据发生变异是值得的;为随后的聚合/修改而设计/提取新变量(例如,一天中的小时、“上午9点后或没有”等)可能会使开发和代码修改变得更容易(特别是在脚本结束和开始之间来回来回的情况下)。

代码语言:javascript
复制
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"
票数 1
EN

Stack Overflow用户

发布于 2018-12-03 22:15:21

代码语言:javascript
复制
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]
票数 0
EN

Stack Overflow用户

发布于 2018-12-03 22:41:57

答案取决于您的时间戳是如何存储的,但是让我们假设它们是"POSIXct" "POSIXt"类型的,比如lubridate::ymd_hms创建的。

然后我们可以使用lubridatedplyr。注意使用dplyr::if_else防止将日期转换为数字。

代码语言:javascript
复制
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)))

结果:

代码语言:javascript
复制
                 dttm hr         dt
1 2018-05-11 11:15:00 11 2018-05-12
2 2018-05-11 01:57:00  1 2018-05-11
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53602720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档