【问题标题】:How to add holidays in strftime in r如何在 r 中的 strftime 中添加假期
【发布时间】:2019-02-28 22:56:34
【问题描述】:
sHour <- seq(from = as.POSIXct("2018-01-05 0:00", tz = "UTC"),
     to = as.POSIXct("2018-01-13 23:00", tz = "UTC"),
     by = "hour")
dayWeek <- strftime(sHour, format = "%u")

My_holidays <- as.POSIXct(c("2018-01-06", "2018-01-09"), tz = "UTC")

星期一是 1 周日是 7 如何将 dayWeek 中的 My_holidays 添加为 7?

期望的输出

 > dayWeek
"5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1"

对于同样在 My_holidays 中的 sHour 中的每个日期(小时),我想将变量从 1、2、3 等更改为变量 7。 所以每个假期和周日都是7点

电流输出

> dayWeek
"5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "5" "6" "6" "6" "6" "6" "6" "6" "6" "6" "6" "6" "6" "6" "6" "6" "6" "6" "6" "6" "6" "6" "6" "6" "6" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "7" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1"

【问题讨论】:

  • 您能提供一份所需输出的样本吗?

标签: r date strftime


【解决方案1】:

这样的?

library( dplyr )

df <- data.table( days = sHour ) %>%
  mutate( holiday = ifelse( as.Date(days) %in% as.Date(My_holidays), "yes", "no"))

#                    days holiday
# ...
# 93  2018-01-08 20:00:00      no
# 94  2018-01-08 21:00:00      no
# 95  2018-01-08 22:00:00      no
# 96  2018-01-08 23:00:00      no
# 97  2018-01-09 00:00:00     yes
# 98  2018-01-09 01:00:00     yes
# 99  2018-01-09 02:00:00     yes
# 100 2018-01-09 03:00:00     yes
# 101 2018-01-09 04:00:00     yes
# 102 2018-01-09 05:00:00     yes
# 103 2018-01-09 06:00:00     yes
# 104 2018-01-09 07:00:00     yes
# 105 2018-01-09 08:00:00     yes
# 106 2018-01-09 09:00:00     yes
# 107 2018-01-09 10:00:00     yes
# 108 2018-01-09 11:00:00     yes
# 109 2018-01-09 12:00:00     yes
# 110 2018-01-09 13:00:00     yes
# 111 2018-01-09 14:00:00     yes
# 112 2018-01-09 15:00:00     yes
# 113 2018-01-09 16:00:00     yes
# 114 2018-01-09 17:00:00     yes
# 115 2018-01-09 18:00:00     yes
# 116 2018-01-09 19:00:00     yes
# 117 2018-01-09 20:00:00     yes
# 118 2018-01-09 21:00:00     yes
# 119 2018-01-09 22:00:00     yes
# 120 2018-01-09 23:00:00     yes
# 121 2018-01-10 00:00:00      no
# 122 2018-01-10 01:00:00      no
# ...

【讨论】:

    【解决方案2】:

    这本质上是一个join 操作,几个 R 包可以提供帮助。我碰巧非常喜欢data.table

    创建您的表格

    R> dt <- data.table(myhour=seq(from = as.POSIXct("2018-01-05 0:00", tz = "UTC"),
    +                              to = as.POSIXct("2018-01-13 23:00", tz = "UTC"), 
    +                              by = "hour"))
    R> dt[, weekday := wday(myhour)]
    R> dt[]
                      myhour weekday
      1: 2018-01-05 00:00:00       6
      2: 2018-01-05 01:00:00       6
      3: 2018-01-05 02:00:00       6
      4: 2018-01-05 03:00:00       6
      5: 2018-01-05 04:00:00       6
     ---                            
    212: 2018-01-13 19:00:00       7
    213: 2018-01-13 20:00:00       7
    214: 2018-01-13 21:00:00       7
    215: 2018-01-13 22:00:00       7
    216: 2018-01-13 23:00:00       7
    R> 
    

    这基本上就是你所拥有的,但作​​为 data.table 使用它的辅助函数 wday() 可以在 DatePOSIXt 上工作。

    创建您的假期

    R> myholidays <- as.Date(c("2018-01-06", "2018-01-09")) # no UTC conversion
    

    大致相同,但我们将其保留为 Date,因为它们是日期对象。

    合并

    R> dt[, isholiday:=FALSE][as.Date(myhour) %in% myholidays, isholiday:=TRUE][]
                      myhour weekday isholiday
      1: 2018-01-05 00:00:00       6     FALSE
      2: 2018-01-05 01:00:00       6     FALSE
      3: 2018-01-05 02:00:00       6     FALSE
      4: 2018-01-05 03:00:00       6     FALSE
      5: 2018-01-05 04:00:00       6     FALSE
     ---                                      
    212: 2018-01-13 19:00:00       7     FALSE
    213: 2018-01-13 20:00:00       7     FALSE
    214: 2018-01-13 21:00:00       7     FALSE
    215: 2018-01-13 22:00:00       7     FALSE
    216: 2018-01-13 23:00:00       7     FALSE
    

    这是关键,我们结合了三个data.table 操作符。首先,我们创建 isholiday 作为布尔值,默认为 FALSE。我们为假期向量中的日期设置了它——从POSIXctDate 的转换是即时发生的。最后我们打印结果。

    检查

    R> head(dt[ isholiday==TRUE, ])
                    myhour weekday isholiday
    1: 2018-01-06 00:00:00       7      TRUE
    2: 2018-01-06 01:00:00       7      TRUE
    3: 2018-01-06 02:00:00       7      TRUE
    4: 2018-01-06 03:00:00       7      TRUE
    5: 2018-01-06 04:00:00       7      TRUE
    6: 2018-01-06 05:00:00       7      TRUE
    R> summary(dt)
         myhour                       weekday     isholiday      
     Min.   :2018-01-05 00:00:00   Min.   :1.00   Mode :logical  
     1st Qu.:2018-01-07 05:45:00   1st Qu.:3.00   FALSE:168      
     Median :2018-01-09 11:30:00   Median :5.00   TRUE :48       
     Mean   :2018-01-09 11:30:00   Mean   :4.56                  
     3rd Qu.:2018-01-11 17:15:00   3rd Qu.:6.00                  
     Max.   :2018-01-13 23:00:00   Max.   :7.00                  
    R> 
    

    检查永远不会有什么坏处。 48 个条目是我们对两天每小时数据的预期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-21
      • 2012-09-13
      • 1970-01-01
      • 2019-06-21
      • 2011-11-19
      • 2022-01-12
      • 1970-01-01
      • 2019-07-18
      相关资源
      最近更新 更多