Lubridate: viertel()-Funktionsfehler

Erstellt am 12. Juni 2018  ·  7Kommentare  ·  Quelle: tidyverse/lubridate

Zunächst möchte ich den Autoren @hadley @jiho @mmparker @zeehio @garrettgman für dieses Paket danken und insbesondere für die Entwicklung der quarter() Funktion, die einen großartigen Beitrag zur Reduzierung des benötigten Codes leistet FY- und Quartalswerte generieren. Ich möchte darauf hinweisen, dass es derzeit anscheinend einen Fehler in der Art und Weise gibt, wie die Funktion quarter() ein Geschäftsjahr mit_Jahr anhängt.

Originales Beispiel
x <- ymd(c("2012-03-26", "2012-05-04", "2012-09-23", "2012-12-31"))
quarter(x, with_year = TRUE, fiscal_start = 11)
[1] 2012.2 2012.3 2012.4 2013.1
Dies funktioniert gut mit dem Datum Dezember 2012, das als Geschäftsjahr 2013 Q1 gemeldet wird.

Wenn ich den Fiskalstart jedoch auf April verschiebe, sehen wir keine ähnliche Behandlung für das Fiskaljahr des ersten Datums – das aufgrund dieser Formatierung das vierte Quartal 2011 sein sollte.
quarter(x, with_year = TRUE, fiscal_start = 4)
[1] 2012.4 2012.1 2012.2 2012.3

Hilfreichster Kommentar

Dies entspricht zwar nicht der von @borgmaan abgedeckten "Fiscal Quarters" @mielniczuk umrissen wurde, um eine Ausgabe von

quarter <- function(x, with_year = FALSE, fiscal_start = 1) {
   fs <- fiscal_start - 1
   shifted <- seq(fs, 11 + fs) %% 12 + 1
   m <- month(x)
   quarters <- rep(1:4, each = 3)
   s <- match(m, shifted)
   q <- quarters[s]
   if (with_year) {
      uq <- quarters[m]
      ifelse(m <= fs, ((year(x)-1) + q/10), (year(x) + q/10))
   }
   else q
}

Alle 7 Kommentare

Ich glaube, es gibt immer noch einen Fehler in der Funktion für fiscal_start von 7, 8 oder 9. Folgendes sehe ich mit der neuesten Version, die von GitHub installiert wurde:

> x
[1] "2012-03-26" "2012-05-04" "2012-09-23" "2012-12-31"
> quarter(x, with_year = TRUE, fiscal_start = 7)
[1] 2012.3 2012.4 2012.1 2012.2
> quarter(x, with_year = TRUE, fiscal_start = 8)
[1] 2012.3 2012.4 2012.1 2012.2
> quarter(x, with_year = TRUE, fiscal_start = 9)
[1] 2012.3 2012.3 2012.1 2012.2

Ich renne:

Session info ------------------------------------------------------------------------------------------------------------------------
 setting  value                       
 version  R version 3.4.4 (2018-03-15)
 system   x86_64, darwin15.6.0        
 ui       RStudio (1.1.453)           
 language (EN)                        
 collate  en_US.UTF-8                 
 tz       America/New_York            
 date     2018-07-23                  

Mit:

Packages ----------------------------------------------------------------------------------------------------------------------------
 package      * version  date       source                              
...
lubridate    * 1.7.4    2018-07-23 Github (tidyverse/lubridate@f7a7c27)
...

In der Tat. Sieht so aus, als wäre die Logik des Viertels schlicht falsch. Werde da vorsichtig graben müssen.

Es lohnt sich wahrscheinlich, das erwartete Verhalten der Funktion zu dokumentieren. FWIW, Wikipedia sagt:

Das Haushaltsjahr wird normalerweise durch das Jahr bezeichnet, in dem es endet, sodass die am 14. November 2018 getätigten Ausgaben der US-Bundesregierung zum Haushaltsjahr 2019 gehören, das nach einem Haushaltskalender von Oktober bis September betrieben wird.

Dies scheint das erwartete Verhalten der meisten Tests zu sein und wird im obigen Fehlerbericht beschrieben. Allerdings scheint einer der Tests aus dem Commit, der dieses Problem schließt, diese Erwartung zu verletzen.

Ich weiß nicht, was richtig ist, aber nach dieser Konvention denke ich, dass der Test aktualisiert werden sollte auf:

x <- ymd(c("2012-03-26", "2012-05-04", "2012-09-23", "2012-03-01", "2012-12-31"))
expect_equal(quarter(x, with_year = TRUE, fiscal_start = 4),
             c(2012.4, 2013.1, 2013.2, 2012.4, 2013.3))

Die folgende Funktion besteht alle anderen Tests (und den oben modifizierten):

quarter <- function(x, with_year = FALSE, fiscal_start = 1) {
  fs <- fiscal_start - 1
  shifted <- seq(fs, 11 + fs) %% 12 + 1
  m <- month(x)
  quarters <- rep(1:4, each = 3)
  s <- match(m, shifted)
  q <- quarters[s]
  if (with_year) {
    uq <- quarters[m]
    inc_year <- (m >= fiscal_start) * (fiscal_start != 1)
    year(x) + inc_year + q/10
  }
  else q
}

Senden Sie gerne eine PR, wenn dies das erwartete Verhalten ist und das Problem löst. Hier ist die vollständige Differenz als Referenz:

diff --git a/R/accessors-quarter.r b/R/accessors-quarter.r
index d299b64..c4bcf55 100644
--- a/R/accessors-quarter.r
+++ b/R/accessors-quarter.r
@@ -29,9 +29,8 @@ quarter <- function(x, with_year = FALSE, fiscal_start = 1) {
   q <- quarters[s]
   if (with_year) {
     uq <- quarters[m]
-    inc_year <- q == 1 & uq == 4
-    dec_year <- q == 4 & uq == 1
-    year(x) + inc_year - dec_year + q/10
+    inc_year <- (m >= fiscal_start) * (fiscal_start != 1)
+    year(x) + inc_year + q/10
   }
   else q
 }
diff --git a/tests/testthat/test-accessors.R b/tests/testthat/test-accessors.R
index 8685192..f7fe0fa 100644
--- a/tests/testthat/test-accessors.R
+++ b/tests/testthat/test-accessors.R
@@ -239,7 +239,7 @@ test_that("quarters accessor extracts correct quarter", {

   x <- ymd(c("2012-03-26", "2012-05-04", "2012-09-23", "2012-03-01", "2012-12-31"))
   expect_equal(quarter(x, with_year = TRUE, fiscal_start = 4),
-               c(2011.4, 2012.1, 2012.2, 2011.4, 2012.3))
+               c(2012.4, 2013.1, 2013.2, 2012.4, 2013.3))
   expect_equal(quarter(x, with_year = TRUE, fiscal_start = 11),
                c(2012.2, 2012.3, 2012.4, 2012.2, 2013.1))
 })

@borgmaan Gab es eine Lösung dafür?

Es scheint, dass der Fehler für Geschäftsjahre, die in Monat 4 (oder 3 oder 2) beginnen, weiterhin besteht. Ich würde erwarten, dass ein Geschäftsjahr ab April 2019-01-10 als Ergebnis für das Geschäftsjahr 2018 Qtr 4 oder 2018.4 für die Funktion quarter() anzeigen würde, wenn mit_year=TRUE. Zur Zeit
quarter('2019-01-10', with_year = TRUE, fiscal_start = 4) produziert 2019.4

Dies entspricht zwar nicht der von @borgmaan abgedeckten "Fiscal Quarters" @mielniczuk umrissen wurde, um eine Ausgabe von

quarter <- function(x, with_year = FALSE, fiscal_start = 1) {
   fs <- fiscal_start - 1
   shifted <- seq(fs, 11 + fs) %% 12 + 1
   m <- month(x)
   quarters <- rep(1:4, each = 3)
   s <- match(m, shifted)
   q <- quarters[s]
   if (with_year) {
      uq <- quarters[m]
      ifelse(m <= fs, ((year(x)-1) + q/10), (year(x) + q/10))
   }
   else q
}

Dieses Problem ist mir entgangen, als ich 2018 vergessen habe, es wieder zu öffnen. Es ist im Master behoben und wird diese Woche für CRAN freigegeben.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen