Skip to content

Commit 570a03a

Browse files
committed
BUG: convert datetime64 -> datetime.datetime for matplotlib, close #1003
1 parent b15ae85 commit 570a03a

File tree

6 files changed

+41
-22
lines changed

6 files changed

+41
-22
lines changed

pandas/core/api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from pandas.core.series import Series, TimeSeries
2020
from pandas.core.frame import DataFrame
2121
from pandas.core.panel import Panel
22-
from pandas.core.groupby import groupby
22+
from pandas.core.groupby import groupby, TimeGrouper
2323
from pandas.core.reshape import pivot_simple as pivot
2424

2525
DataMatrix = DataFrame

pandas/core/generic.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def convert(self, rule, method='pad', how='last', axis=0, as_index=True):
145145
axis : int, optional, default 0
146146
as_index : see synonymous argument of groupby
147147
"""
148-
from pandas.core.groupby import Tinterval, translate_grouping
148+
from pandas.core.groupby import TimeGrouper, translate_grouping
149149

150150
if isinstance(rule, basestring):
151151
rule = datetools.to_offset(rule)
@@ -160,7 +160,8 @@ def convert(self, rule, method='pad', how='last', axis=0, as_index=True):
160160
if not isinstance(rule, datetools.DateOffset):
161161
raise ValueError("Rule not a recognized offset")
162162

163-
interval = Tinterval(rule, label='right', closed='right', _obj=self)
163+
interval = TimeGrouper(rule, label='right',
164+
closed='right', _obj=self)
164165

165166
currfreq = len(idx)
166167
targfreq = len(interval.binner) - 2 # since binner extends endpoints

pandas/core/groupby.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -782,7 +782,7 @@ def _generate_time_binner(dtindex, offset,
782782

783783
return DatetimeIndex(freq=offset, start=first, end=last, periods=nperiods)
784784

785-
class Tinterval(Grouper, CustomGrouper):
785+
class TimeGrouper(Grouper, CustomGrouper):
786786
"""
787787
Custom groupby class for time-interval grouping
788788
@@ -831,7 +831,7 @@ def set_obj(self, obj):
831831
self.obj = obj
832832

833833
if not isinstance(obj.index, DatetimeIndex):
834-
raise ValueError("Cannot apply Tinterval to non-DatetimeIndex")
834+
raise ValueError("Cannot apply TimeGrouper to non-DatetimeIndex")
835835

836836
index = obj.index
837837

pandas/core/index.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,10 @@ def __str__(self):
156156
return u'%s([%s], dtype=''%s'')' % (type(self).__name__, converted,
157157
str(self.values.dtype))
158158

159+
def _mpl_repr(self):
160+
# how to represent ourselves to matplotlib
161+
return self.values
162+
159163
@property
160164
def values(self):
161165
return np.asarray(self)
@@ -1386,6 +1390,10 @@ def _cached_range(cls, start=None, end=None, periods=None, offset=None,
13861390

13871391
return indexSlice
13881392

1393+
def _mpl_repr(self):
1394+
# how to represent ourselves to matplotlib
1395+
return self.values.astype('O')
1396+
13891397
def __repr__(self):
13901398
if self.offset is not None:
13911399
output = str(self.__class__) + '\n'
@@ -2185,9 +2193,9 @@ def map(self, func_to_map):
21852193
except:
21862194
return super(DatetimeIndex, self).map(func_to_map)
21872195

2188-
def _mplib_repr(self):
2196+
def _mpl_repr(self):
21892197
# how to represent ourselves to matplotlib
2190-
return datetools._skts_box_array(self, self.freq), False
2198+
return datetools._skts_box_array(self, self.freq)
21912199

21922200
def to_timestamp(self):
21932201
"""

pandas/tests/test_timeseries.py

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,15 @@
55

66
import nose
77

8-
from numpy import nan
98
import numpy as np
10-
import numpy.ma as ma
119

12-
from pandas import (Index, Series, TimeSeries, DataFrame, isnull, notnull,
10+
from pandas import (Index, Series, TimeSeries, DataFrame, isnull,
1311
date_range, Timestamp)
14-
from pandas.core.index import MultiIndex
1512

1613
from pandas import DatetimeIndex
1714

18-
import pandas.core.datetools as datetools
19-
import pandas.core.nanops as nanops
20-
21-
from pandas.util import py3compat
2215
from pandas.util.testing import assert_series_equal, assert_almost_equal
2316
import pandas.util.testing as tm
24-
import pandas
2517

2618

2719
import pandas._tseries as lib
@@ -42,7 +34,7 @@
4234

4335
from pandas.util.testing import assert_series_equal, assert_frame_equal
4436

45-
from pandas.core.groupby import Tinterval
37+
from pandas.core.groupby import TimeGrouper
4638
from pandas.core.datetools import Minute, BDay, Timestamp
4739

4840
import pandas.core.common as com
@@ -483,7 +475,7 @@ def test_custom_grouper(self):
483475
data = np.array([1]*len(dti))
484476
s = Series(data, index=dti)
485477

486-
b = Tinterval(Minute(5))
478+
b = TimeGrouper(Minute(5))
487479
g = s.groupby(b)
488480

489481
self.assertEquals(g.ngroups, 2593)
@@ -511,7 +503,7 @@ def test_convert_basic(self):
511503

512504
result = s.convert('5Min')
513505

514-
grouper = Tinterval(Minute(5), closed='right', label='right')
506+
grouper = TimeGrouper(Minute(5), closed='right', label='right')
515507
expect = s.groupby(grouper).agg(lambda x: x[-1])
516508

517509
assert_series_equal(result, expect)
@@ -585,7 +577,7 @@ def test_convert_upsample(self):
585577
def test_convert_olhc(self):
586578
s = self.series
587579

588-
grouper = Tinterval(Minute(5), closed='right', label='right')
580+
grouper = TimeGrouper(Minute(5), closed='right', label='right')
589581
expect = s.groupby(grouper).agg(lambda x: x[-1])
590582
result = s.convert('5Min', how='ohlc')
591583

pandas/tools/plotting.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,8 @@ def plt(self):
221221

222222
def _get_xticks(self):
223223
index = self.data.index
224-
is_datetype = index.inferred_type in ('datetime', 'date')
224+
is_datetype = index.inferred_type in ('datetime', 'date',
225+
'datetime64')
225226

226227
if self.use_index:
227228
if index.is_numeric() or is_datetype:
@@ -231,7 +232,7 @@ def _get_xticks(self):
231232
matplotlib raises exception when using non numeric/datetime
232233
values for xaxis, several actions are already taken by plt.
233234
"""
234-
x = index.values
235+
x = index._mpl_repr()
235236
else:
236237
self._need_to_set_index = True
237238
x = range(len(index))
@@ -535,6 +536,23 @@ def plot_series(series, label=None, kind='line', use_index=True, rot=None,
535536

536537
return plot_obj.ax
537538

539+
# if use_index:
540+
# # custom datetime/interval plotting
541+
# from pandas import IntervalIndex, DatetimeIndex
542+
# if isinstance(self.index, IntervalIndex):
543+
# return tsp.tsplot(self)
544+
# if isinstance(self.index, DatetimeIndex):
545+
# offset = self.index.freq
546+
# name = datetools._newOffsetNames.get(offset, None)
547+
# if name is not None:
548+
# try:
549+
# code = datetools._interval_str_to_code(name)
550+
# s_ = Series(self.values,
551+
# index=self.index.to_interval(freq=code),
552+
# name=self.name)
553+
# tsp.tsplot(s_)
554+
# except:
555+
# pass
538556

539557
def boxplot(data, column=None, by=None, ax=None, fontsize=None,
540558
rot=0, grid=True, figsize=None):

0 commit comments

Comments
 (0)