Skip to content

ARROW-16653: [R] All formats are supported with the lubridate parse_date_time binding - #13506

Merged
paleolimbot merged 11 commits into
apache:masterfrom
rok:ARROW-16653
Jul 29, 2022
Merged

ARROW-16653: [R] All formats are supported with the lubridate parse_date_time binding#13506
paleolimbot merged 11 commits into
apache:masterfrom
rok:ARROW-16653

Conversation

@rok

@rokrok commented Jul 4, 2022

Copy link
Copy Markdown
Member

This is to resolve ARROW-16653.

Please note the intent here is to map out currently available formats via a new test. That is to support ARROW-16395 which will add ymd_hms() ymd_hm() ymd_h() dmy_hms() dmy_hm() dmy_h() mdy_hms() mdy_hm() mdy_h() ydm_hms() ydm_hm() ydm_h().

Currently most lubridate supported flags are available and this adds a test. Remaining are %q and %Op that we don't need to resolve ARROW-16395. We could open a ticket for adding support for the two remaining flags to C++ strptime or wait for users to request them.

@github-actions

Copy link
Copy Markdown

@rok
rok marked this pull request as ready for review July 22, 2022 05:26
@rok
rokforce-pushed the ARROW-16653 branch 2 times, most recently from 9dde78a to 7cb9c69CompareJuly 22, 2022 05:46
@rok

rok commented Jul 22, 2022

Copy link
Copy Markdown
MemberAuthor

@dragosmg

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just tiny things...looks great!

Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R Outdated
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R Outdated
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R Outdated
@dragosmg

dragosmg commented Jul 22, 2022

Copy link
Copy Markdown
Contributor

I think the scope of the Jira is to also test/ check/ make sure all formats are supported with parse_date_time(). This means we might need to get rid of the supported_orderslist and test they actually work.

@rok

rok commented Jul 22, 2022

Copy link
Copy Markdown
MemberAuthor

I think the scope of the Jira is to also test/ check/ make sure all formats are supported with parse_date_time(). This means we might need to get rid of the supported_orderslist and test they actually work.

I forgot about that! 😄
Please check 772ee78.

@dragosmg

Copy link
Copy Markdown
Contributor

I forgot about that! 😄 Please check 772ee78.

Could you add a test/ tests for parse_date_time() with some of the formats / orders this enables?

@dragosmg

dragosmg commented Jul 22, 2022

Copy link
Copy Markdown
Contributor

LGTM once we have a test with the additional formats we now support & the CI passes. Thanks for your work on lubridate, @rok! 🙏🏻

Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R Outdated

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems like @dragosmg was looking for a parse_date_time() test but I see a number of those tests in #13627 (am I reading that correctly?). In any case, I trust you to either add those tests to #13627 or create a follow-up ticket to add them in their own PR.

@dragosmg

dragosmg commented Jul 22, 2022

Copy link
Copy Markdown
Contributor

Once we remove the guardrails, it would be good to test orders that aren't covered by #13627, such as: parse_date_time("12/17/1996 04:00:00 PM", "mdYHMSp"). If my memory serves me well, we have test covering the following formats: y, Y, m, d, D, H, M, S, I, b, B. I don't think we have anything covering j, p, u, v, w etc.

@paleolimbot

Copy link
Copy Markdown
Member

@dragosmg Can you create a follow-up ticket for that?

@dragosmg

dragosmg commented Jul 22, 2022

Copy link
Copy Markdown
Contributor

I can, but @rok might be close to a unit test for those additional formats. If he is, I'd rather we have the tests in this PR as they go together.

@dragosmg

Copy link
Copy Markdown
Contributor

to clarify, that test would be nice to have, but it doesn't mean that without it the features aren't tested. ultimately, parse_date_time() calls strptime so, as long as those formats are tested with strptime they should work just fine with parse_date_time().

@rok

rok commented Jul 22, 2022

Copy link
Copy Markdown
MemberAuthor

to clarify, that test would be nice to have, but it doesn't mean that without it the features aren't tested. ultimately, parse_date_time() calls strptime so, as long as those formats are tested with strptime they should work just fine with parse_date_time().

👍
The thing is I started looking into frankenformats (e.g. Y-%b-d) which are supported by lubridate, but they brake our orders parsing here. I'll try to make it work and make it reject frankenformats if I can't. Does that seem ok?

Comment threadr/R/dplyr-datetime-helpers.R Outdated
@rok
rokforce-pushed the ARROW-16653 branch 4 times, most recently from 9257a41 to ee856baCompareJuly 25, 2022 06:47
Comment threadr/R/dplyr-datetime-helpers.R Outdated
Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R Outdated

@dragosmgdragosmg left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for your work. I have some minor comments, and a larger concern. I am not convinced the build_formats() now works correctly:

# all the formatting characters should be supported
build_formats("wIpz")
#> Error: "wIpz" `orders` not supported in Arrow

Comment threadr/R/dplyr-datetime-helpers.R Outdated
supported_passed_orders <- intersect(orders, supported_orders)
formats_list <- map(orders, build_format_from_order)
formats_length <- map(map(formats_list, nchar), max)
invalid_orders <- formats_length < 6

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think adding some comments here would help for our future selves. For example, on why you think 6 is a good threshold.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems unlikely that < 6 characters is the only threshold for an invalid order?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not exactly sure how to check if an order is valid as it really comes down to strptime implementation used. I'm switching to detecting if no valid formats are present or not and will check what lubridate does.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lubridate checks against an example of it's input, which is something we can't/won't do.
I'd say erroring on invalid formats and returning NA on unsuccessful parsing would be the thing to do.

@dragosmgdragosmgJul 28, 2022

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree. That sounds like a good plan

Comment threadr/R/dplyr-datetime-helpers.R Outdated
Comment threadr/R/dplyr-datetime-helpers.R Outdated

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I comment everywhere I saw some R code that looked out of place...in general I have little idea what's going on here and I think some comments would help.

Comment threadr/tests/testthat/test-dplyr-funcs-datetime.R Outdated
Comment threadr/R/dplyr-datetime-helpers.R Outdated
supported_passed_orders <- intersect(orders, supported_orders)
formats_list <- map(orders, build_format_from_order)
formats_length <- map(map(formats_list, nchar), max)
invalid_orders <- formats_length < 6

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems unlikely that < 6 characters is the only threshold for an invalid order?

Comment threadr/R/dplyr-datetime-helpers.R Outdated
Comment threadr/R/dplyr-datetime-helpers.R Outdated
Comment threadr/R/dplyr-datetime-helpers.R Outdated
Co-authored-by: Dewey Dunnington <dewey@fishandwhistle.net>
@rok
rokforce-pushed the ARROW-16653 branch 3 times, most recently from b68ad44 to 1cc88c9CompareJuly 28, 2022 02:01
@rok

rok commented Jul 28, 2022

Copy link
Copy Markdown
MemberAuthor
# all the formatting characters should be supported
build_formats("wIpz")
#> Error: "wIpz" `orders` not supported in Arrow

Added this to tests.

@rok

rok commented Jul 28, 2022

Copy link
Copy Markdown
MemberAuthor

Thanks for the reviews @dragosmg@paleolimbot !
I've pushed a new set of changes, could you please review them? I'm still hoping to get this into the release 🤞 .

@dragosmgdragosmg left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Thanks for sticking with it!

@rok

rok commented Jul 28, 2022

Copy link
Copy Markdown
MemberAuthor

@github-actions crossbow submit -g r

@github-actions

Copy link
Copy Markdown

Revision: 17b46ab

Submitted crossbow builds: ursacomputing/crossbow @ actions-156d8fedd0

TaskStatus
conda-linux-gcc-py37-cpu-r40Azure
conda-linux-gcc-py37-cpu-r41Azure
conda-osx-clang-py37-r40Azure
conda-osx-clang-py37-r41Azure
conda-win-vs2017-py37-r40Azure
conda-win-vs2017-py37-r41Azure
homebrew-r-autobrewGithub Actions
homebrew-r-brewGithub Actions
r-binary-packagesGithub Actions
test-fedora-r-clang-sanitizerAzure
test-r-arrow-backwards-compatibilityGithub Actions
test-r-depsource-bundledAzure
test-r-depsource-systemGithub Actions
test-r-dev-duckdbGithub Actions
test-r-devdocsGithub Actions
test-r-gcc-11Github Actions
test-r-gcc-12Github Actions
test-r-install-localGithub Actions
test-r-linux-as-cranGithub Actions
test-r-linux-rchkGithub Actions
test-r-linux-valgrindAzure
test-r-minimal-buildAzure
test-r-offline-maximalGithub Actions
test-r-offline-minimalAzure
test-r-rhub-debian-gcc-devel-lto-latestAzure
test-r-rhub-debian-gcc-release-custom-ccacheAzure
test-r-rhub-ubuntu-gcc-release-latestAzure
test-r-rocker-r-base-latestAzure
test-r-rstudio-r-base-4.1-opensuse153Azure
test-r-rstudio-r-base-4.2-centos7-devtoolset-8Azure
test-r-rstudio-r-base-4.2-focalAzure
test-r-ubuntu-22.04Github Actions
test-r-versionsGithub Actions
test-ubuntu-18.04-r-sanitizerAzure

@paleolimbotpaleolimbot left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With these changes it's much more readable...thank you!

@paleolimbot

Copy link
Copy Markdown
Member

(The sanitizer error was fixed already and valgrind will likely fail when it completes but that is a separate issue)

@paleolimbot
paleolimbot merged commit 3e87c66 into apache:masterJul 29, 2022
@rok

rok commented Jul 29, 2022

Copy link
Copy Markdown
MemberAuthor

Thank you for fast reviews and feedback @dragosmg and @paleolimbot !

@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = f645ffa and contender = 3e87c66. 3e87c66 is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Failed ⬇️3.77% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️0.65% ⬆️0.0%] test-mac-arm
[Finished ⬇️0.0% ⬆️0.0%] ursa-i9-9960x
[Finished ⬇️0.39% ⬆️0.07%] ursa-thinkcentre-m75q
Buildkite builds:
[Failed] 3e87c66a ec2-t3-xlarge-us-east-2
[Finished] 3e87c66a test-mac-arm
[Finished] 3e87c66a ursa-i9-9960x
[Finished] 3e87c66a ursa-thinkcentre-m75q
[Failed] f645ffa2 ec2-t3-xlarge-us-east-2
[Finished] f645ffa2 test-mac-arm
[Finished] f645ffa2 ursa-i9-9960x
[Finished] f645ffa2 ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

kszucs pushed a commit that referenced this pull request Jul 29, 2022
…date_time` binding (#13506)
This is to resolve [ARROW-16653](https://issues.apache.org/jira/browse/ARROW-16653).
Please note the intent here is to map out currently available formats via a new test. That is to support [ARROW-16395](https://issues.apache.org/jira/browse/ARROW-16395) which will add `ymd_hms() ymd_hm() ymd_h() dmy_hms() dmy_hm() dmy_h() mdy_hms() mdy_hm() mdy_h() ydm_hms() ydm_hm() ydm_h()`.
Currently most [lubridate supported flags](https://lubridate.tidyverse.org/reference/parse_date_time.html#details) are available and this adds a test. Remaining are `%q` and `%Op` that we don't need to resolve [ARROW-16395](https://issues.apache.org/jira/browse/ARROW-16395). We could open a ticket for adding support for the two remaining flags to C++ `strptime` or wait for users to request them.
Lead-authored-by: Rok <rok@mihevc.org>
Co-authored-by: Rok Mihevc <rok@mihevc.org>
Signed-off-by: Dewey Dunnington <dewey@fishandwhistle.net>
paleolimbot added a commit that referenced this pull request Jan 16, 2023
Changes introduced by [ARROW-16653](#13506) were not written up by NEWS.md.
Lead-authored-by: Rok <rok@mihevc.org>
Co-authored-by: Dewey Dunnington <dewey@voltrondata.com>
Co-authored-by: Rok Mihevc <rok@mihevc.org>
Signed-off-by: Dewey Dunnington <dewey@voltrondata.com>
kou pushed a commit that referenced this pull request Feb 20, 2023
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@rok@dragosmg@paleolimbot@ursabot