Lubridate: floor_date(x, unit = 'weeks') ignoriert die Option lubridate.week.start

Erstellt am 18. Jan. 2017  ·  7Kommentare  ·  Quelle: tidyverse/lubridate

Hallo,

floor_date(x, unit = 'weeks') gibt den gleichen Wert zurück (der vorherige Sonntag, in meinen Tests), unabhängig davon, wie die Option lubridate.week.start eingestellt ist:

library(lubridate)

options(lubridate.week.start = 7)
wday(ymd('2017-01-02'))                         # 2
floor_date(ymd('2017-01-02'), unit = 'weeks')   # "2017-01-01"

options(lubridate.week.start = 1)
wday(ymd('2017-01-02'))                         # 1
floor_date(ymd('2017-01-02'), unit = 'weeks')   # "2017-01-01"

Wie das obige Snippet zeigt, ändern sich zwar die Ergebnisse von wday(x) entsprechend lubridate.week.start , die Ergebnisse von floor_date(x, unit = 'weeks') jedoch nicht. Wenn der Wochenstart auf Sonntag gesetzt ist, sollte floor_date() intuitiv immer einen Sonntag zurückgeben; Wenn die Option auf Montag eingestellt ist, sollte die Funktion immer einen Montag zurückgeben usw.

Ich glaube, das Problem liegt tatsächlich daran, dass die Funktion update() diese Option ebenfalls ignoriert:

options(lubridate.week.start = 7)
update(ymd('2017-01-02'), wday = 1)     # "2017-01-01"
wday(ymd('2017-01-01'))                 # 1

options(lubridate.week.start = 1)
update(ymd('2017-01-02'), wday = 1)     # "2017-01-01"
wday(ymd('2017-01-01'))                 # 7

Im letzteren Fall liefert wday(update(x, wday = 1)) kein Ergebnis von 1 , obwohl wir ausdrücklich wday = 1 gesetzt haben.

Hilfreichster Kommentar

Fest. Danke für die Meldung.

Alle 7 Kommentare

ceiling_date verwendet auch nicht die Option week.start
Für die meisten Arbeiten muss die Woche an einem Freitag enden und ich habe auf ein case_when zurückgegriffen, um dorthin zu gelangen.

@pjrdata Ich habe hier einen schnellen Hack einer Lösung, die Sie vielleicht nützlich finden:

floor_date_by_week <- function(the_date) { return(date(the_date) - wday(the_date + 1) + 1) } ceiling_date_by_week <- function(the_date) { return(date(the_date) - wday(the_date) + 7) }

Beispiel:

````
for (week_start in seq(1, 7)) { # 1 = So, 7 = Sa
Optionen (schmieren.week.start = week_start)
print(floor_date_by_week(ymd('2017-03-16')))
}

[1] "2017-03-12"
[1] "2017-03-13"
[1] "2017-03-14"
[1] "2017-03-15"
[1] "2017-03-16"
[1] "2017-03-10"
[1] "2017-03-11"

for (week_start in seq(1, 7)) { # 1 = So, 7 = Sa
Optionen (schmieren.week.start = week_start)
print(ceiling_date_by_week(ymd('2017-03-16')))
}

[1] "2017-03-19"
[1] "2017-03-20"
[1] "2017-03-21"
[1] "2017-03-22"
[1] "2017-03-16"
[1] "2017-03-17"
[1] "2017-03-18"
````

Ich habe dies nicht vollständig getestet, also entschuldige ich mich, wenn es einen Fehler gibt!

Fest. Danke für die Meldung.

Hallo, ich sehe dieses Problem immer noch mit Version 1.6.0

1.7.0 sollte innerhalb von ein oder zwei Tagen auf CRAN verfügbar sein.

Hallo, das Problem scheint wieder aufgetaucht zu sein. Ich verwende Lubridate 1.7.4

round_date(ymd("2019-10-22"),unit="week",week_start = 5)
[1] "2019-10-20"
round_date(ymd("2019-10-22"),unit="week",week_start = 1)
[1] "2019-10-20"

Hier sind die Sitzungsinformationen für den Fall, dass Namespace-Probleme auftreten.

Sitzungsinfo()
R-Version 3.5.1 (2018-07-02)
Plattform: x86_64-w64-mingw32/x64 (64-Bit)
Läuft unter: Windows >= 8 x64 (Build 9200)

Matrix-Produkte: Standard

Gebietsschema:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C LC_TIME=English_United States.1252

angehängte Basispakete:
[1] Statistiken Grafiken GrDevices Utils Datasets Methodenbasis

andere angehängte Pakete:
[1] schmieren_1.7.4

über einen Namensraum geladen (und nicht angehängt):
[1] Rcpp_0.12.18 crayon_1.3.4 dplyr_0.7.6 behaupten, dass_0.2.0 R6_2.2.2 magrittr_1.5 pillar_1.3.0 stringi_1.2.4
[9] rlang_0.2.2 rstudioapi_0.7 bindrcpp_0.2.2 tools_3.5.1 stringr_1.3.1 glue_1.3.0 purrr_0.2.5 yaml_2.2.0
[17] compiler_3.5.1 pkgconfig_2.0.2 bindr_0.1.1 knitr_1.20 tidyselect_0.2.4 tibble_1.4.2

Bitte verwenden Sie die Entwicklung. Im OP ging es um floor_date, es gab auch einen Fehler in round_date.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

vspinu picture vspinu  ·  6Kommentare

courtiol picture courtiol  ·  6Kommentare

arnonerba picture arnonerba  ·  9Kommentare

garrettgman picture garrettgman  ·  7Kommentare

Teebusch picture Teebusch  ·  3Kommentare