I have a pandas.DataFrame of which one of the columns, 'Time', contains datetime objects:
In [3]: df['Time'] Out[3]: req_id d95bc740-d320-4d80-b851-81b7b7758a8f 2019-01-17 23:29:43.043 0df512ee-094c-46ce-a041-a6a9c90fddef 2019-01-17 23:26:29.464 e87807b3-b681-4343-8ba3-9e35df99f2d5 2019-01-17 23:17:34.659 cc638d8a-947d-40ec-8488-9292f801eb5b 2019-01-17 23:15:26.953 b710d0e8-7e51-49c1-9bda-6abca2794fa8 2019-01-17 23:15:05.375 142fbb7a-6472-4d4e-a5b9-5a4a4d4ae747 2019-01-17 23:14:51.050 6a0dd117-6d1e-4a2e-9efa-f2cac73b1aa0 2019-01-17 23:14:26.762 03ed901e-f6fb-47b3-bcea-d4afa7432bd3 2019-01-17 23:12:10.766 1b6c8326-518e-4c62-8a72-84052cd6f024 2019-01-17 23:11:30.688 d4f3144a-56d8-438d-bc0d-4e8d0afee2ff 2019-01-17 23:10:10.456 43976955-f32c-494b-b7f4-5c04abc2108a 2019-01-17 23:10:07.456 1f8a88d2-e4fd-437f-852f-026ed0eb30e7 2019-01-17 23:09:48.396 7fc550a1-2df1-4839-b5fd-59cf1d6c9c0e 2019-01-17 23:09:28.372 2cd8481e-79ab-4491-bcac-18761b9381ce 2019-01-17 23:09:08.752 18b2dc35-fae6-4e75-abd2-5bdadd8a1079 2019-01-17 23:08:14.430 43cc41f4-18cf-4854-8c78-89805f902dbf 2019-01-17 23:05:32.962 f27e1c06-4f69-4a76-bb80-49799b897edb 2019-01-17 23:04:33.882 c641e2d1-4560-406f-a5b0-46e9bd27207d 2019-01-17 23:03:43.959 f3726c23-d3ae-4a87-94b0-6462f9de733c 2019-01-17 23:03:27.322 e0fb0974-fc1f-48b6-a7b5-b647e0d33fd2 2019-01-17 23:03:06.342 c968bbd4-6e44-4920-a4a3-d5b7632f232d 2019-01-17 23:03:01.342 41b811f8-98ca-4cd3-97b8-ab9c6287ab98 2019-01-17 23:00:47.052 ca6d86cd-7293-41c2-a976-c70403dca18e 2019-01-17 22:58:58.446 97a83d4d-a847-4953-b411-49847b821683 2019-01-17 22:58:50.723 05ccb053-a56a-42bd-acec-08fddc71c26b 2019-01-17 22:58:03.835 b5af2bbb-9121-4d5f-bf30-6310c5b88584 2019-01-17 22:57:01.791 839541a4-5ae6-4081-bff0-c3799beda90f 2019-01-17 22:56:40.152 cc9e46e3-d437-4d19-a4fe-3245f5e840be 2019-01-17 22:56:27.432 672d1115-10e0-40b8-9ca7-40b0d587c85a 2019-01-17 22:56:09.961 7eb5afd7-dc48-4bb2-bb51-cf33dfeafe3f 2019-01-17 22:52:42.589 ... eb2bb272-2205-43b2-8984-927cfffbc2fd 2019-01-14 12:45:35.045 8bcee5a8-2244-4f1f-bbf4-f05cd40513ed 2019-01-14 12:38:43.214 b0d312fb-01d2-4398-bf3f-798aab7f914d 2019-01-14 12:38:14.694 d7ce9ed6-db9d-4c0c-8256-7d94e135341f 2019-01-14 12:11:20.465 cfbda676-331c-4cb8-afbb-ad195a035d13 2019-01-14 12:10:21.011 3fd28c37-44d3-4031-8507-a15b1bbbb1d1 2019-01-14 11:41:04.615 9fd55a9d-33ff-47cd-888b-01bc0b5e1793 2019-01-14 10:50:34.951 bc84a61f-a368-4119-9522-6c6bd5fd4408 2019-01-14 10:38:12.292 6a69d9e8-2a49-4762-abd1-c6ce79f48986 2019-01-14 10:31:24.628 ab043246-5ea3-41ec-9a7b-1db7b7b6c863 2019-01-14 09:29:04.368 6bbe661f-da05-4811-b719-d7a14ba262e5 2019-01-14 06:55:29.992 e5c4bfa3-a052-4c8c-929b-8f5000a24acd 2019-01-14 06:51:05.613 9a116376-5340-42f4-9bce-6d9d05ea7bee 2019-01-14 06:42:46.614 5b971ccf-0f55-4244-a433-49e590e7d5de 2019-01-14 06:37:49.787 fd10da87-2187-4804-9e4d-a6a7d1cef375 2019-01-14 06:24:42.298 b9faaa07-ec43-4add-b0f7-b5a40968d573 2019-01-14 04:32:17.795 688b367b-e9f7-413d-9e60-4e1b73a138f2 2019-01-14 04:06:16.833 fcf902c7-dba9-4b51-89bb-36668ec447d2 2019-01-14 02:50:02.308 bedfd669-5f2f-44c2-b26c-32a3835196c8 2019-01-14 02:48:28.684 ea3c6ed4-f98b-4032-8cf8-df78bf04c4f7 2019-01-14 02:47:13.542 1817d944-e71a-4f74-95b8-6ceb5e529ca8 2019-01-14 02:46:02.994 732c0c33-5824-4876-a530-fce7911e47fe 2019-01-14 02:44:04.990 f54efa6c-2379-4d3d-a8ec-6388db46b8b7 2019-01-14 02:42:27.867 c348cc27-4906-4fd0-980f-fc96dcf0115f 2019-01-14 02:40:45.497 5d11ae5c-1d7a-41e8-9963-dd051f091ad9 2019-01-14 02:39:25.439 f692de03-389e-4ca8-bc19-fc13bff379df 2019-01-14 02:38:06.084 44f79ab5-aca4-480a-b5f7-24df5ea887ba 2019-01-14 02:36:24.071 98f64b91-6192-4ae3-8d26-d65e50835a26 2019-01-14 02:15:56.977 b581804c-ef22-4b18-90a4-a4df260c91c5 2019-01-14 02:06:31.885 93f57887-7840-4b08-be9e-7e239f6eb569 2019-01-14 02:03:37.644 Name: Time, Length: 367, dtype: datetime64[ns]
I'd like to plot a histogram of these times. However if I try
df.hist(column='Time')
I get the following error message:
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-2-6b19a0524017> in <module> ----> 1 exec(open('analysis/check_refunds_fix.py').read())<string> in <module>
/usr/local/lib/python3.7/site-packages/pandas/plotting/_core.py in hist_frame(data, column, by, grid, xlabelsize, xrot, ylabelsize, yrot, ax, sharex, sharey, figsize, layout, bins, **kwds)
2406 fig, axes = _subplots(naxes=naxes, ax=ax, squeeze=False,
2407 sharex=sharex, sharey=sharey, figsize=figsize,
-> 2408 layout=layout)
2409 _axes = _flatten(axes)
2410/usr/local/lib/python3.7/site-packages/pandas/plotting/_tools.py in _subplots(naxes, sharex, sharey, squeeze, subplot_kw, ax, layout, layout_type, **fig_kw)
236
237 # Create first subplot separately, so we can share it if requested
–> 238 ax0 = fig.add_subplot(nrows, ncols, 1, **subplot_kw)
239
240 if sharex:/usr/local/lib/python3.7/site-packages/matplotlib/figure.py in add_subplot(self, *args, **kwargs)
1365 self._axstack.remove(ax)
1366
-> 1367 a = subplot_class_factory(projection_class)(self, *args, **kwargs)
1368 self._axstack.add(key, a)
1369 self.sca(a)/usr/local/lib/python3.7/site-packages/matplotlib/axes/_subplots.py in init(self, fig, args, **kwargs)
58 raise ValueError(
59 (“num must be 1 <= num <= {maxn}, not {num}”
—> 60 ).format(maxn=rowscols, num=num))
61 self._subplotspec = GridSpec(
62 rows, cols, figure=self.figure)[int(num) - 1]ValueError: num must be 1 <= num <= 0, not 1
The error message doesn’t really make sense to me, because no number num can satisfy 1 <= num <= 0. I’ve tried to reproduce this with a ‘simple’ example but there I do get a histogram. Any ideas what the issue might be here?
Update
I’ve set a trace in the matplotlib source code for the SubplotBase class:
class SubplotBase(object):
“”"
Base class for subplots, which are :class:Axes
instances with
additional methods to facilitate generating and manipulating a set
of :class:Axes
within a figure.
“”"def __init__(self, fig, *args, **kwargs): """ *fig* is a :class:`matplotlib.figure.Figure` instance. *args* is the tuple (*numRows*, *numCols*, *plotNum*), where the array of subplots in the figure has dimensions *numRows*, *numCols*, and where *plotNum* is the number of the subplot being created. *plotNum* starts at 1 in the upper left corner and increases to the right. If *numRows* <= *numCols* <= *plotNum* < 10, *args* can be the decimal integer *numRows* * 100 + *numCols* * 10 + *plotNum*. """ self.figure = fig if len(args) == 1: if isinstance(args[0], SubplotSpec): self._subplotspec = args[0] else: try: s = str(int(args[0])) rows, cols, num = map(int, s) except ValueError: raise ValueError('Single argument to subplot must be ' 'a 3-digit integer') self._subplotspec = GridSpec(rows, cols, figure=self.figure)[num - 1] # num - 1 for converting from MATLAB to python indexing elif len(args) == 3: rows, cols, num = args rows = int(rows) cols = int(cols) if isinstance(num, tuple) and len(num) == 2: num = [int(n) for n in num] self._subplotspec = GridSpec( rows, cols, figure=self.figure)[(num[0] - 1):num[1]] else: if num < 1 or num > rows*cols: raise ValueError( ("num must be 1 <= num <= {maxn}, not {num}" ).format(maxn=rows*cols, num=num)) self._subplotspec = GridSpec( rows, cols, figure=self.figure)[int(num) - 1] # num - 1 for converting from MATLAB to python indexing else: raise ValueError('Illegal argument(s) to subplot: %s' % (args,))
In the elif len(args) == 3 block, I can confirm that the constructor was called with rows = 1, cols = 0, and num = 1. I guess the problem is that cols = 0; why is it trying to initialize a subplot without any columns?
#python #pandas