分组日期为中午而不是午夜

时间:2017-09-20 21:37:39

标签: r tidyverse

我有一个数据集,有时候每天都有多个集合。我想创建一个我可以用来捆绑“天”的字段,但我想在午间而不是午夜分开。不幸的是,当我进行“午间分割”时,日期值是整数而不是日期值。

一些示例代码:

library(tidyverse)
x <- as.POSIXct(Sys.time()) 

y <- as.tibble(x)

#midnights comes through correctly as a date
y %>%
  mutate(midnights=as.Date(value)) 

#middays comes through as an integer instead of a date
y %>%
  mutate(middays=ifelse(as.numeric(format(value,"%H")) >= 12,
                        as.Date(value),
                        as.Date(value)-1)) 

我应该做些什么?

2 个答案:

答案 0 :(得分:2)

您可以使用的一个技巧是通过调用xas.numeric(x)转换为自纪元以来的秒数。然后要获得自纪元以来的天数,它只是as.numeric(x) %/% 86400(因为一天有86400秒)。因此,您可以使用此值按天分割(即在午夜分割)。如果你想转移&#39;这需要12个小时,您需要做的就是将x移动12小时,即运行as.numeric(dates + 12 * 3600) %/% 86400

例如

dates <- structure(c(1505771227.18457, 1505814427.18457, 1505857627.18457, 
         1505900827.18457, 1505944027.18457, 1505987227.18457, 
         1506030427.18457), class = c("POSIXct", "POSIXt"))
#[1] "2017-09-18 22:47:07 BST" "2017-09-19 10:47:07 BST" "2017-09-19 22:47:07 BST" "2017-09-20 10:47:07 BST"
#[5] "2017-09-20 22:47:07 BST" "2017-09-21 10:47:07 BST" "2017-09-21 22:47:07 BST"

as.numeric(dates) %/% 86400 # use this to group by day (split at midnight)
#[1] 17427 17428 17428 17429 17429 17430 17430

as.numeric(dates + 12 * 3600) %/% 86400 # use this to split at noon
#[1] 17428 17428 17429 17429 17430 17430 17431

或者,如果您想使用lubridate,您可以播放相同的技巧,即计算lubridate::floor_date(dates + lubridate::hours(12), 'day'),将日期移动12小时,然后找到日期,并按此分组。

答案 1 :(得分:2)

as.Date()返回一个数字,因为它会删除类信息。只需将整个内容包装在另一个y %>% mutate(middays=as.Date(ifelse(as.numeric(format(value,"%H")) >= 12, as.Date(value), as.Date(value)-1),origin="1970-01-01")) 中:

if_else

或使用dplyr中的y %>% mutate(middays=if_else(as.numeric(format(value,"%H")) >= 12, as.Date(value), as.Date(value)-1)) ## A tibble: 1 × 2 # value middays # <dttm> <date> #1 2017-09-21 08:28:05 2017-09-19 对其进行排序

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1341)
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1352)
    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)