带润滑剂的R日期序列

nbysray5  于 2023-04-03  发布在  其他
关注(0)|答案(3)|浏览(87)

你好,我想用lubridate得到一个日期序列
这不管用

seq(ymd('2012-04-07'),ymd('2013-03-22'),by=week(1))

基地指挥部

seq(as.Date('2012-04-7'),as.Date('2013-03-22'),'weeks')

确实如此,但我想知道是否有一个优雅的方式来做到这一点与lubridate。

编辑

请忽略:解决了我自己,所以只留给后代。很高兴有这个删除,如果必要的。

seq(ymd('2012-04-07'),ymd('2013-03-22'),by='weeks')

成功了

voj3qocg

voj3qocg1#

ymd是一个 Package 器,用于解析日期字符串并返回POSIXct对象。
您只需要使用?seq.POSIXt(而不是lubridate)中描述的标准术语来定义周

seq(ymd('2012-04-07'),ymd('2013-03-22'), by = '1 week')
seq(ymd('2012-04-07'),ymd('2013-03-22'), by = 'weeks')

威尔作品
照意愿

seq(ymd('2012-04-07'),ymd('2013-03-22'), by = '2 week')

您可以将lubridatePeriod类对象强制转换为difftime,但这似乎没有必要

seq(ymd('2012-04-07'),ymd('2013-03-22'), by = as.difftime(weeks(1)))
dfty9e19

dfty9e192#

这是一种坚持在lubridatePOSIXct宇宙中的方法,并且不会将日期格式更改为基于R的POSIXt。我避免在脚本中更改日期格式,因为我发现这是一个常见的引入错误(例如时区更改或丢失时间戳)的地方。使用%m+%时遵循以下建议:R: adding 1 month to a date

# example date is a leap day for a "worst case scenario"
library("lubridate")
posixct.in <- parse_date_time(x = "2016-02-29", orders = "ymd")
# [1] "2016-02-29 UTC"

posixct.seq <- posixct.in %m+% years(x = seq.int(from = 0, to = 3, by = 1))
# [1] "2016-02-29 UTC" "2017-02-28 UTC" "2018-02-28 UTC" "2019-02-28 UTC"

posixct.seq <- posixct.in %m+% months(x = seq.int(from = 0, to = 3, by = 1))
# [1] "2016-02-29 UTC" "2016-03-29 UTC" "2016-04-29 UTC" "2016-05-29 UTC"

posixct.seq <- posixct.in %m+% days(x = seq.int(from = 0, to = 3, by = 1))
# [1] "2016-02-29 UTC" "2016-03-01 UTC" "2016-03-02 UTC" "2016-03-03 UTC"

posixct.seq <- posixct.in %m+% weeks(x = seq.int(from = 0, to = 3, by = 1))
# [1] "2016-02-29 UTC" "2016-03-07 UTC" "2016-03-14 UTC" "2016-03-21 UTC"

常规的+有时也可以工作,但%m+%可以防止这样的错误:

posixct.seq <- posixct.in + years(x = seq.int(from = 0, to = 3, by = 1))
# [1] "2016-02-29 UTC" NA               NA               NA

起初我很困惑,因为我认为%m+只是一种添加月份的方法,类似的lubridate命令,如%y+%等并不存在。但是,事实证明“m”并不代表“月份添加”。我最好的猜测是“魔术”=)

6gpjuf90

6gpjuf903#

这可能对其他人有用,也可能没用,但我已经编写了一个更通用的函数,用于使用lubridate,base和timechange的组合来计算日期序列。它允许period或duration(base)算术。

# remotes::install_github("NicChr/timeplyr")
library(timeplyr)
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:base':
#> 
#>     date, intersect, setdiff, union
seq(ymd('2012-04-07'),ymd('2013-03-22'),by='weeks')
#>  [1] "2012-04-07" "2012-04-14" "2012-04-21" "2012-04-28" "2012-05-05"
#>  [6] "2012-05-12" "2012-05-19" "2012-05-26" "2012-06-02" "2012-06-09"
#> [11] "2012-06-16" "2012-06-23" "2012-06-30" "2012-07-07" "2012-07-14"
#> [16] "2012-07-21" "2012-07-28" "2012-08-04" "2012-08-11" "2012-08-18"
#> [21] "2012-08-25" "2012-09-01" "2012-09-08" "2012-09-15" "2012-09-22"
#> [26] "2012-09-29" "2012-10-06" "2012-10-13" "2012-10-20" "2012-10-27"
#> [31] "2012-11-03" "2012-11-10" "2012-11-17" "2012-11-24" "2012-12-01"
#> [36] "2012-12-08" "2012-12-15" "2012-12-22" "2012-12-29" "2013-01-05"
#> [41] "2013-01-12" "2013-01-19" "2013-01-26" "2013-02-02" "2013-02-09"
#> [46] "2013-02-16" "2013-02-23" "2013-03-02" "2013-03-09" "2013-03-16"
time_seq(ymd('2012-04-07'),ymd('2013-03-22'),by='weeks')
#>  [1] "2012-04-07" "2012-04-14" "2012-04-21" "2012-04-28" "2012-05-05"
#>  [6] "2012-05-12" "2012-05-19" "2012-05-26" "2012-06-02" "2012-06-09"
#> [11] "2012-06-16" "2012-06-23" "2012-06-30" "2012-07-07" "2012-07-14"
#> [16] "2012-07-21" "2012-07-28" "2012-08-04" "2012-08-11" "2012-08-18"
#> [21] "2012-08-25" "2012-09-01" "2012-09-08" "2012-09-15" "2012-09-22"
#> [26] "2012-09-29" "2012-10-06" "2012-10-13" "2012-10-20" "2012-10-27"
#> [31] "2012-11-03" "2012-11-10" "2012-11-17" "2012-11-24" "2012-12-01"
#> [36] "2012-12-08" "2012-12-15" "2012-12-22" "2012-12-29" "2013-01-05"
#> [41] "2013-01-12" "2013-01-19" "2013-01-26" "2013-02-02" "2013-02-09"
#> [46] "2013-02-16" "2013-02-23" "2013-03-02" "2013-03-09" "2013-03-16"

# Months example

# Notice the difference between seq and time_seq
time_seq(dmy("31-01-2012"), dmy("31-01-2013"), by = "month")
#>  [1] "2012-01-31" "2012-02-29" "2012-03-31" "2012-04-30" "2012-05-31"
#>  [6] "2012-06-30" "2012-07-31" "2012-08-31" "2012-09-30" "2012-10-31"
#> [11] "2012-11-30" "2012-12-31" "2013-01-31"
seq(dmy("31-01-2012"), dmy("31-01-2013"), by = "month")
#>  [1] "2012-01-31" "2012-03-02" "2012-03-31" "2012-05-01" "2012-05-31"
#>  [6] "2012-07-01" "2012-07-31" "2012-08-31" "2012-10-01" "2012-10-31"
#> [11] "2012-12-01" "2012-12-31" "2013-01-31"

# DST example
dst <- dmy_hms("26-03-2023 00:00:00", tz = "GB")

# Base R
seq(dst, length.out = 5,
         by = "hour")
#> [1] "2023-03-26 00:00:00 GMT" "2023-03-26 02:00:00 BST"
#> [3] "2023-03-26 03:00:00 BST" "2023-03-26 04:00:00 BST"
#> [5] "2023-03-26 05:00:00 BST"
time_seq(dst, length.out = 5,
         by = "hour",
         seq_type = "duration")
#> [1] "2023-03-26 00:00:00 GMT" "2023-03-26 02:00:00 BST"
#> [3] "2023-03-26 03:00:00 BST" "2023-03-26 04:00:00 BST"
#> [5] "2023-03-26 05:00:00 BST"
# Period arithmetic
time_seq(dst, length.out = 5,
         roll_dst = "NA",
         by = "hour",
         seq_type = "period")
#> [1] "2023-03-26 00:00:00 GMT" NA                       
#> [3] "2023-03-26 02:00:00 BST" "2023-03-26 03:00:00 BST"
#> [5] "2023-03-26 04:00:00 BST"
time_seq(dst, length.out = 5,
         roll_dst = "pre",
         by = "hour",
         seq_type = "period")
#> [1] "2023-03-26 00:00:00 GMT" "2023-03-26 00:00:00 GMT"
#> [3] "2023-03-26 02:00:00 BST" "2023-03-26 03:00:00 BST"
#> [5] "2023-03-26 04:00:00 BST"
time_seq(dst, length.out = 5,
         roll_dst = "post",
         by = "hour",
         seq_type = "period")
#> [1] "2023-03-26 00:00:00 GMT" "2023-03-26 02:00:00 BST"
#> [3] "2023-03-26 02:00:00 BST" "2023-03-26 03:00:00 BST"
#> [5] "2023-03-26 04:00:00 BST"

# You can also mix dates and datetimes

seq(ymd('2012-04-07'), now(), by = "years")
#> Error in seq.Date(ymd("2012-04-07"), now(), by = "years"): 'to' must be a "Date" object
time_seq(ymd('2012-04-07'), now(), by = "years")
#>  [1] "2012-04-07 UTC" "2013-04-07 UTC" "2014-04-07 UTC" "2015-04-07 UTC"
#>  [5] "2016-04-07 UTC" "2017-04-07 UTC" "2018-04-07 UTC" "2019-04-07 UTC"
#>  [9] "2020-04-07 UTC" "2021-04-07 UTC" "2022-04-07 UTC"

创建于2023-03-28带有reprex v2.0.2

相关问题