Title: Type promotion error with datetime bins in hist · Issue #15332 · matplotlib/matplotlib · GitHub
Open Graph Title: Type promotion error with datetime bins in hist · Issue #15332 · matplotlib/matplotlib
X Title: Type promotion error with datetime bins in hist · Issue #15332 · matplotlib/matplotlib
Description: Bug report It appears that pyplot.hist (and I believe the equivalent axis method) does not allow lists of date or datetime objects to be used as the bin edges, even if the things being binned are dates, so: from datetime import datetime ...
Open Graph Description: Bug report It appears that pyplot.hist (and I believe the equivalent axis method) does not allow lists of date or datetime objects to be used as the bin edges, even if the things being binned are d...
X Description: Bug report It appears that pyplot.hist (and I believe the equivalent axis method) does not allow lists of date or datetime objects to be used as the bin edges, even if the things being binned are d...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/15332
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Type promotion error with datetime bins in hist","articleBody":"### Bug report\r\nIt appears that `pyplot.hist` (and I believe the equivalent axis method) does not allow lists of `date` or `datetime` objects to be used as the bin edges, even if the things being binned are dates, so:\r\n\r\n```python\r\nfrom datetime import datetime\r\n\r\nimport matplotlib as mpl\r\nfrom matplotlib import pyplot as plt\r\n\r\ndates = [\r\n datetime(2019, 1, 5), datetime(2019, 1, 11), datetime(2019, 2, 1),\r\n datetime(2019, 2, 5), datetime(2019, 2, 18), datetime(2019, 3, 1),\r\n]\r\n\r\ndate_edges = [\r\n datetime(2019, 1, 1), datetime(2019, 2, 1), datetime(2019, 3, 1),\r\n]\r\n\r\nplt.hist(dates) # Works\r\nplt.hist(dates, bins=mpl.dates.date2num(date_edges)) # Works\r\nplt.hist(dates, bins=date_edges) # Fails\r\n```\r\n\r\nThe first `hist` call works but doesn't specify the bins, the second one works and does what we want, but it requires actively converting `date_edges`. The third one *should* do the same thing as the second one, but instead it fails with:\r\n\r\n\u003e TypeError: '\u003c' not supported between instances of 'float' and 'datetime.datetime'\r\n\r\nFull error message below:\r\n\r\n\u003cdetails\u003e\r\n\r\n```\r\nTypeError Traceback (most recent call last)\r\n\u003cipython-input-27-5b07a69daccb\u003e in \u003cmodule\u003e\r\n----\u003e 1 plt.hist(dates, bins=date_bins)\r\n\r\n/tmp/mpl/lib/python3.7/site-packages/matplotlib/pyplot.py in hist(x, bins, range, density, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, normed, data, **kwargs)\r\n 2640 align=align, orientation=orientation, rwidth=rwidth, log=log,\r\n 2641 color=color, label=label, stacked=stacked, normed=normed,\r\n-\u003e 2642 **({\"data\": data} if data is not None else {}), **kwargs)\r\n 2643\r\n 2644\r\n\r\n/tmp/mpl/lib/python3.7/site-packages/matplotlib/__init__.py in inner(ax, data, *args, **kwargs)\r\n 1599 def inner(ax, *args, data=None, **kwargs):\r\n 1600 if data is None:\r\n-\u003e 1601 return func(ax, *map(sanitize_sequence, args), **kwargs)\r\n 1602\r\n 1603 bound = new_sig.bind(ax, *args, **kwargs)\r\n\r\n/tmp/mpl/lib/python3.7/site-packages/matplotlib/axes/_axes.py in hist(self, x, bins, range, density, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, normed, **kwargs)\r\n 6765 # this will automatically overwrite bins,\r\n 6766 # so that each histogram uses the same bins\r\n-\u003e 6767 m, bins = np.histogram(x[i], bins, weights=w[i], **hist_kwargs)\r\n 6768 m = m.astype(float) # causes problems later if it's an int\r\n 6769 if mlast is None:\r\n\r\n\u003c__array_function__ internals\u003e in histogram(*args, **kwargs)\r\n\r\n/tmp/mpl/lib/python3.7/site-packages/numpy/lib/histograms.py in histogram(a, bins, range, normed, weights, density)\r\n 869 for i in _range(0, len(a), BLOCK):\r\n 870 sa = np.sort(a[i:i+BLOCK])\r\n--\u003e 871 cum_n += _search_sorted_inclusive(sa, bin_edges)\r\n 872 else:\r\n 873 zero = np.zeros(1, dtype=ntype)\r\n\r\n/tmp/mpl/lib/python3.7/site-packages/numpy/lib/histograms.py in _search_sorted_inclusive(a, v)\r\n 452 \"\"\"\r\n 453 return np.concatenate((\r\n--\u003e 454 a.searchsorted(v[:-1], 'left'),\r\n 455 a.searchsorted(v[-1:], 'right')\r\n 456 ))\r\n\r\nTypeError: '\u003c' not supported between instances of 'float' and 'datetime.datetime'\r\n```\r\n\u003c/details\u003e\r\n\r\nI think this is another manifestation of the same underlying problem we saw in #12863 (see my comments in there for some more details on that), which is that a lot of the `datetime` stuff converts somewhat eagerly to floats but *some* of it doesn't.\r\n\r\nI think this case is easier than #12863 in the sense that you can almost certainly translate this into an unambiguous point on the number line and eagerly convert the bin edges early on, depending on how `matplotlib` treats naive datetimes. It's possible that you may want to detect if `x` and `bins` are both naive or both aware and throw an error if they aren't, but I don't see that as a major sticking point.\r\n\r\n**Matplotlib version**\r\n * Operating system: Linux\r\n * Matplotlib version: 3.1.1\r\n * Matplotlib backend (`print(matplotlib.get_backend())`): TkAgg\r\n * Python version: 3.7.4","author":{"url":"https://github.com/pganssle","@type":"Person","name":"pganssle"},"datePublished":"2019-09-23T19:50:21.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":4},"url":"https://github.com/15332/matplotlib/issues/15332"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:6d3227f5-4ac6-3b17-e8af-ecc13ed0e282 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | DE62:1BA1D0:92D77D:C2B690:6A531554 |
| html-safe-nonce | 5e9698044d1827ab52130e8a0fb3b0dbe526ec5125c33684af83a70bf6742310 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJERTYyOjFCQTFEMDo5MkQ3N0Q6QzJCNjkwOjZBNTMxNTU0IiwidmlzaXRvcl9pZCI6IjM5NDY3NjUzOTEzMzQ5Mzc5NDEiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | c795738ffb0b1eda273763144af517554ae650707a2f3301e4d02180b190481d |
| hovercard-subject-tag | issue:497293852 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/matplotlib/matplotlib/15332/issue_layout |
| twitter:image | https://opengraph.githubassets.com/e57ee2ed9406c26deebcb2c41d2c5af36d2a32b05095784f96039b469f1a8b70/matplotlib/matplotlib/issues/15332 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/e57ee2ed9406c26deebcb2c41d2c5af36d2a32b05095784f96039b469f1a8b70/matplotlib/matplotlib/issues/15332 |
| og:image:alt | Bug report It appears that pyplot.hist (and I believe the equivalent axis method) does not allow lists of date or datetime objects to be used as the bin edges, even if the things being binned are d... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | pganssle |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git |
| octolytics-dimension-user_id | 215947 |
| octolytics-dimension-user_login | matplotlib |
| octolytics-dimension-repository_id | 1385122 |
| octolytics-dimension-repository_nwo | matplotlib/matplotlib |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1385122 |
| octolytics-dimension-repository_network_root_nwo | matplotlib/matplotlib |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 07a982c1d40157c619b364352b704c3ce66bb332 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width