我有一个数据集,有时候每天都有多个集合。我想创建一个我可以用来捆绑“天”的字段,但我想在午间而不是午夜分开。不幸的是,当我进行“午间分割”时,日期值是整数而不是日期值。
一些示例代码:
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))
我应该做些什么?
答案 0 :(得分:2)
您可以使用的一个技巧是通过调用x
将as.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)