-
Notifications
You must be signed in to change notification settings - Fork 207
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
quarter() function bug #682
Comments
I believe there is still a bug in the function for
I'm running:
With:
|
Indeed. Looks like the logic of quarter is plain bogus. Will have to carefully dig into it. |
It's probably worth documenting the expected behavior of the function. FWIW, Wikipedia says:
That seems to be the expected behavior of most of the tests and what is described in the bug report above. However, one of the tests from the commit closing this issue seems to violate that expectation. I don't know what is right, but following that convention, I believe the test should be updated to:
The following function passes all other tests (and the modified one above):
Happy to submit a PR if this is the expected behavior and solves the issue. Here's the full diff for reference:
|
@borgmaan Was there a resolution to this? |
It appears the bug still exists for fiscal years starting in month 4 (or 3 or 2). I would expect that a FY starting April would show 2019-01-10 as FY 2018 Qtr 4 or 2018.4 result for the quarter() function when with_year=TRUE. Currently |
While this doesn't conform to the "Fiscal Quarters" definition covered by @borgmaan, it does address the incorrect year for fiscal_start=4 outlined by @mielniczuk to produce an output of 2018.4 (Fiscal Years that START in April and end in Mach of the following year).
|
This issue slipped my radar as I forgot to re-open it back in 2018. It's fixed in the master and will be released to CRAN this week. |
Version 1.7.10 ============== ### NEW FEATURES * `fast_strptime()` and `parse_date_time2()` now accept multiple formats and apply them in turn ### BUG FIXES * [#926](tidyverse/lubridate#926) Fix incorrect division of intervals by months involving leap years * Fix incorrect skipping of digits during parsing of the `%z` format Version 1.7.9.2 =============== ### NEW FEATURES * [#914](tidyverse/lubridate#914) New `rollforward()` function * [#928](tidyverse/lubridate#928) On startup lubridate now resets TZDIR to a proper directory when it is set to non-dir values like "internal" or "macOS" (a change introduced in R4.0.2) * [#630](tidyverse/lubridate#630) New parsing functions `ym()` and `my()` ### BUG FIXES * [#930](tidyverse/lubridate#930) `as.period()` on intervals now returns valid Periods with double fields (not integers) Version 1.7.9 ============= ### NEW FEATURES * [#871](tidyverse/lubridate#893) Add `vctrs` support ### BUG FIXES * [#890](tidyverse/lubridate#890) Correctly compute year in `quarter(..., with_year = TRUE)` * [#893](tidyverse/lubridate#893) Fix incorrect parsing of abbreviated months in locales with trailing dot (regression in v1.7.8) * [#886](tidyverse/lubridate#886) Fix `with_tz()` for POSIXlt objects * [#887](tidyverse/lubridate#887) Error on invalid numeric input to `month()` * [#889](tidyverse/lubridate#889) Export new dmonth function Version 1.7.8 ============= ### NEW FEATURES * (breaking) Year and month durations now assume 365.25 days in a year consistently in conversion and constructors. Particularly `dyears(1) == years(1)` is now `TRUE`. * Format and print methods for 0-length objects are more consistent. * New duration constructor `dmonths()` to complement other duration constructors. * * `duration()` constructor now accepts `months` and `years` arguments. * [#629](tidyverse/lubridate#629) Added `format_ISO8601()` methods. * [#672](tidyverse/lubridate#672) Eliminate all partial argument matches * [#674](tidyverse/lubridate#674) `as_date()` now ignores the `tz` argument * [#675](tidyverse/lubridate#675) `force_tz()`, `with_tz()`, `tz<-` convert dates to date-times * [#681](tidyverse/lubridate#681) New constants `NA_Date_` and `NA_POSIXct_` which parallel built-in primitive constants. * [#681](tidyverse/lubridate#681) New constructors `Date()` and `POSIXct()` which parallel built-in primitive constructors. * [#695](tidyverse/lubridate#695) Durations can now be compared with numeric vectors. * [#707](tidyverse/lubridate#707) Constructors return 0-length inputs when called with no arguments * [#713](tidyverse/lubridate#713) (breaking) `as_datetime()` always returns a `POSIXct()` * [#717](tidyverse/lubridate#717) Common generics are now defined in `generics` dependency package. * [#719](tidyverse/lubridate#719) Negative Durations are now displayed with leading `-`. * [#829](tidyverse/lubridate#829) `%within%` throws more meaningful messages when applied on unsupported classes * [#831](tidyverse/lubridate#831) Changing hour, minute or second of Date object now yields POSIXct. * [#869](tidyverse/lubridate#869) Propagate NAs to all internal components of a Period object ### BUG FIXES * [#682](tidyverse/lubridate#682) Fix quarter extraction with small `fiscal_start`s. * [#703](tidyverse/lubridate#703) `leap_year()` works with objects supported by `year()`. * [#778](tidyverse/lubridate#778) `duration()/period()/make_difftime()` work with repeated units * `c.Period` concatenation doesn't fail with empty components. * Honor `exact = TRUE` argument in `parse_date_time2`, which was so far ignored. Version 1.7.4 ============= ### NEW FEATURES * [#658](tidyverse/lubridate#658) `%within%` now accepts a list of intervals, in which case an instant is checked if it occurs within any of the supplied intervals. ### CHANGES * [#661](tidyverse/lubridate#661) Throw error on invalid multi-unit rounding. * [#633](tidyverse/lubridate#633) `%%` on intervals relies on `%m+` arithmetic and doesn't produce NAs when intermediate computations result in non-existent dates. * `tz()` always returns "UTC" when `tzone` attribute cannot be inferred. ### BUG FIXES * [#664](tidyverse/lubridate#664) Fix lookup of period functions in `as.period` * [#649](tidyverse/lubridate#664) Fix system timezone memoization Version 1.7.3 ============= ### BUG FIXES * [#643](tidyverse/lubridate#643), [#640](tidyverse/lubridate#640), [#645](tidyverse/lubridate#645) Fix faulty caching of system timezone.
The logic still seems broken in lubridate 1.8.0
expected output: |
@robinmarlow I just went nuts with this as well... your understanding was my understanding, but apparently we are both wrong. However, it's easy to see the confusion. I have two recommendations @vspinu:
EDIT - or at least modify the documentation to reflect the fact that it's the ending year |
@DataStrategist I have just pushed a change incorporating your proposal. You now can do x <- ymd(c("2012-03-01", "2012-03-26", "2012-05-04", "2012-09-23", "2012-12-31"))
quarter(x, type = "year_start/end", fiscal_start = 4)
## [1] "2011/12 Q4" "2011/12 Q4" "2012/13 Q1" "2012/13 Q2" "2012/13 Q3" |
Sorry if this is a breaking change! |
No it's not. I have just added a new value for "type" parameter. If you have some ideas for a better name than "year_start/end" please let me know. |
Oh I see what has been done... that's perfect. May I still recommend a documentation change: from:
to
Just for clarity :) |
Done. Thanks! |
Version 1.9.3 ============= ### NEW FEATURES * [#682](tidyverse/lubridate#682 (comment)) Add type="year_start/end" argument to `quarter()` which produces a complete description of the quarter. ### BUG FIXES * [#1109](tidyverse/lubridate#1109) Fix recycling of the year slot in `as.period(unit = "month")` with Periods and Intervals. * [#1133](tidyverse/lubridate#1133) Don't error on addition on infinite periods.
First, I would like to thank the authors @hadley @jiho @mmparker @zeehio @garrettgman for this package, and in particular the development of the
quarter()
function which does a great job of reducing the amount of code needed to generate FY and Quarter values. I would like to point out that there currently appears to be a bug in the way thequarter()
function appends a fiscal year with_year.Original example
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
This works fine with the december 2012 date reported as fiscal year 2013 Q1.
However if I move the fiscal start to April, we don't see similar treatment for fiscal year of the first date -- which should be 2011 Q4 based on this formatting.
quarter(x, with_year = TRUE, fiscal_start = 4)
[1]
2012.42012.1 2012.2 2012.3
The text was updated successfully, but these errors were encountered: