【问题标题】:Define custom days in R在 R 中定义自定义日期
【发布时间】:2019-07-27 04:47:42
【问题描述】:

我想定义一天的开始和结束时间。

例如,假设我不想在第二天上午 10 点之前开始新的一天。

对于示例数据,我有以下内容:

                    dt
1  2015-01-01 10:45:00
2  2015-01-01 11:30:00
3  2015-01-01 11:45:00
4  2015-01-01 12:00:00
5  2015-01-01 12:30:00
6  2015-01-01 13:00:00
7  2015-01-01 14:30:00
8  2015-01-01 15:00:00
9  2015-01-01 16:30:00
10 2015-01-01 16:45:00
11 2015-01-01 18:15:00
12 2015-01-01 18:45:00
13 2015-01-01 19:15:00
14 2015-01-01 21:45:00
15 2015-01-01 22:00:00
16 2015-01-01 23:00:00
17 2015-01-01 23:15:00
18 2015-01-02 00:00:00
19 2015-01-02 11:45:00
20 2015-01-02 17:00:00
21 2015-01-02 18:00:00
22 2015-01-02 19:15:00
23 2015-01-02 21:30:00
24 2015-01-02 21:45:00
25 2015-01-02 22:45:00

可以将此数据中的dput() 复制到 R 中。

data <- structure(list(dt = structure(c(1420111800, 1420127100, 1420129800, 
1420133400, 1420149600, 1420150500, 1420154100, 1420155900, 1420157700, 
1420200000, 1420203600, 1420206300, 1420209000, 1420215300, 1420218000, 
1420224300, 1420229700, 1420231500, 1420234200, 1420236900, 1420239600, 
1420240500, 1420241400, 1420244100, 1420245900), class = c("POSIXct", 
"POSIXt"), tzone = "UTC")), row.names = c(NA, -25L), class = "data.frame")

我计算过去星期几的唯一方法是使用lubridate::wday,如下所示

data %>% 
  mutate(dow = wday(dt, label = T))

                    dt dow
1  2015-01-01 11:30:00 Thu
2  2015-01-01 15:45:00 Thu
3  2015-01-01 16:30:00 Thu
4  2015-01-01 17:30:00 Thu
5  2015-01-01 22:00:00 Thu
6  2015-01-01 22:15:00 Thu
7  2015-01-01 23:15:00 Thu
8  2015-01-01 23:45:00 Thu
9  2015-01-02 00:15:00 Fri # make Thu
10 2015-01-02 12:00:00 Fri
11 2015-01-02 13:00:00 Fri 
12 2015-01-02 13:45:00 Fri 
13 2015-01-02 14:30:00 Fri 
14 2015-01-02 16:15:00 Fri 
15 2015-01-02 17:00:00 Fri 
16 2015-01-02 18:45:00 Fri 
17 2015-01-02 20:15:00 Fri
18 2015-01-02 20:45:00 Fri
19 2015-01-02 21:30:00 Fri
20 2015-01-02 22:15:00 Fri
21 2015-01-02 23:00:00 Fri
22 2015-01-02 23:15:00 Fri
23 2015-01-02 23:30:00 Fri
24 2015-01-03 00:15:00 Sat # make Fri
25 2015-01-03 00:45:00 Sat # make Fri

如果假设新的一天直到第二天上午 10 点才开始,我标记了不正确的日期。

我很好奇有哪些选项可用于定义新一天的开始/结束时间。

【问题讨论】:

  • 看起来您是在有意地以 UTC 定义点,尽管寻找要在夏威夷或大溪地时间之外定义的日子。这有意义吗?您真的要定义 UTC-10 时区以外的天数吗?
  • 我认为更多地考虑这样一种情况,即您拥有诸如酒吧或俱乐部之类的业务,其中将销售定义为在午夜结束对其应用程序没有多大意义。定义打开/关闭时间比 0 到 2400 小时更有意义。

标签: r date datetime lubridate


【解决方案1】:

缺少时区更改,我认为您最好的选择是在一天中的某个时间关闭if_else,类似于您现在正在做的事情:

library(dplyr)
library(lubridate)
data %>%
  mutate(
    dow = wday(dt, label = T),
    dow2 = wday(dt - if_else(hour(dt) < 11, 86400, 0), label = TRUE)
  )
#                     dt dow dow2
# 1  2015-01-01 11:30:00 Thu  Thu
# 2  2015-01-01 15:45:00 Thu  Thu
# 3  2015-01-01 16:30:00 Thu  Thu
# 4  2015-01-01 17:30:00 Thu  Thu
# 5  2015-01-01 22:00:00 Thu  Thu
# 6  2015-01-01 22:15:00 Thu  Thu
# 7  2015-01-01 23:15:00 Thu  Thu
# 8  2015-01-01 23:45:00 Thu  Thu
# 9  2015-01-02 00:15:00 Fri  Thu
# 10 2015-01-02 12:00:00 Fri  Fri
# 11 2015-01-02 13:00:00 Fri  Fri
# 12 2015-01-02 13:45:00 Fri  Fri
# 13 2015-01-02 14:30:00 Fri  Fri
# 14 2015-01-02 16:15:00 Fri  Fri
# 15 2015-01-02 17:00:00 Fri  Fri
# 16 2015-01-02 18:45:00 Fri  Fri
# 17 2015-01-02 20:15:00 Fri  Fri
# 18 2015-01-02 20:45:00 Fri  Fri
# 19 2015-01-02 21:30:00 Fri  Fri
# 20 2015-01-02 22:15:00 Fri  Fri
# 21 2015-01-02 23:00:00 Fri  Fri
# 22 2015-01-02 23:15:00 Fri  Fri
# 23 2015-01-02 23:30:00 Fri  Fri
# 24 2015-01-03 00:15:00 Sat  Fri
# 25 2015-01-03 00:45:00 Sat  Fri

(这个if_else比较简单,可以简写成wday(dt - 86400*(hour(dt) &lt; 11), label = TRUE)。)

【讨论】:

    【解决方案2】:

    使用base

    data$dow <- with(data, ifelse(strftime(dt, "%H") < 11, 
                      strftime(dt - as.difftime(1, units = "days"), "%a"), 
                      strftime(dt, "%a")
                      )
         )
    

    【讨论】:

      【解决方案3】:

      我想知道这是否能让你到达那里:

      data %>% 
        mutate(
          dt1 = dt - hours(10),
          dow = wday(dt1, label = T))
      
                          dt                 dt1 dow
      1  2015-01-01 11:30:00 2015-01-01 01:30:00 Thu
      2  2015-01-01 15:45:00 2015-01-01 05:45:00 Thu
      3  2015-01-01 16:30:00 2015-01-01 06:30:00 Thu
      4  2015-01-01 17:30:00 2015-01-01 07:30:00 Thu
      5  2015-01-01 22:00:00 2015-01-01 12:00:00 Thu
      6  2015-01-01 22:15:00 2015-01-01 12:15:00 Thu
      7  2015-01-01 23:15:00 2015-01-01 13:15:00 Thu
      8  2015-01-01 23:45:00 2015-01-01 13:45:00 Thu
      9  2015-01-02 00:15:00 2015-01-01 14:15:00 Thu
      10 2015-01-02 12:00:00 2015-01-02 02:00:00 Fri
      11 2015-01-02 13:00:00 2015-01-02 03:00:00 Fri
      12 2015-01-02 13:45:00 2015-01-02 03:45:00 Fri
      13 2015-01-02 14:30:00 2015-01-02 04:30:00 Fri
      14 2015-01-02 16:15:00 2015-01-02 06:15:00 Fri
      15 2015-01-02 17:00:00 2015-01-02 07:00:00 Fri
      16 2015-01-02 18:45:00 2015-01-02 08:45:00 Fri
      17 2015-01-02 20:15:00 2015-01-02 10:15:00 Fri
      18 2015-01-02 20:45:00 2015-01-02 10:45:00 Fri
      19 2015-01-02 21:30:00 2015-01-02 11:30:00 Fri
      20 2015-01-02 22:15:00 2015-01-02 12:15:00 Fri
      21 2015-01-02 23:00:00 2015-01-02 13:00:00 Fri
      22 2015-01-02 23:15:00 2015-01-02 13:15:00 Fri
      23 2015-01-02 23:30:00 2015-01-02 13:30:00 Fri
      24 2015-01-03 00:15:00 2015-01-02 14:15:00 Fri
      25 2015-01-03 00:45:00 2015-01-02 14:45:00 Fri
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-04
        • 2015-12-11
        相关资源
        最近更新 更多