Skip to content

Commit 61aac3d

Browse files
Chang Shewesm
Chang She
authored andcommitted
ENH: datetime.time converters for plotting
1 parent ce4ae93 commit 61aac3d

File tree

6 files changed

+804
-653
lines changed

6 files changed

+804
-653
lines changed

pandas/src/datetime.pxd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ cdef extern from "datetime.h":
3434
int PyDateTime_TIME_GET_MICROSECOND(object o)
3535
bint PyDateTime_Check(object o)
3636
bint PyDate_Check(object o)
37+
bint PyTime_Check(object o)
3738
object PyDateTime_FromDateAndTime(int year, int month, int day, int hour,
3839
int minute, int second, int us)
3940

pandas/src/inference.pyx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ cdef inline bint is_datetime(object o):
103103
cdef inline bint is_date(object o):
104104
return PyDate_Check(o)
105105

106+
cdef inline bint is_time(object o):
107+
return PyTime_Check(o)
108+
106109
def is_bool_array(ndarray values):
107110
cdef:
108111
Py_ssize_t i, n = len(values)
@@ -240,6 +243,14 @@ def is_date_array(ndarray[object] values):
240243
return False
241244
return True
242245

246+
def is_time_array(ndarray[object] values):
247+
cdef int i, n = len(values)
248+
if n == 0:
249+
return False
250+
for i in range(n):
251+
if not is_time(values[i]):
252+
return False
253+
return True
243254

244255
def maybe_convert_numeric(ndarray[object] values, set na_values,
245256
convert_empty=True):

pandas/tools/plotting.py

Lines changed: 10 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@
1616
import pandas.tseries.tools as datetools
1717
import pandas.lib as lib
1818

19+
try: # mpl optional
20+
import pandas.tseries.converter as conv
21+
conv.register()
22+
except ImportError:
23+
pass
24+
1925
def _get_standard_kind(kind):
2026
return {'density' : 'kde'}.get(kind, kind)
2127

@@ -492,8 +498,9 @@ def plt(self):
492498

493499
def _get_xticks(self, convert_period=False):
494500
index = self.data.index
495-
is_datetype = index.inferred_type in ('datetime', 'date',
496-
'datetime64')
501+
is_datetype = (index.inferred_type in ('datetime', 'date',
502+
'datetime64')
503+
or lib.is_time_array(index))
497504

498505
if self.use_index:
499506
if convert_period and isinstance(index, PeriodIndex):
@@ -508,6 +515,7 @@ def _get_xticks(self, convert_period=False):
508515
"""
509516
x = index._mpl_repr()
510517
else:
518+
foo
511519
self._need_to_set_index = True
512520
x = range(len(index))
513521
else:
@@ -578,40 +586,6 @@ def _post_plot_logic(self):
578586
if self.subplots and self.legend:
579587
self.axes[0].legend(loc='best')
580588

581-
try: # matplotlib is optional dependency
582-
import matplotlib.units as units
583-
import matplotlib.dates as dates
584-
585-
class DatetimeConverter(dates.DateConverter):
586-
587-
@staticmethod
588-
def convert(values, unit, axis):
589-
def try_parse(values):
590-
try:
591-
return datetools.to_datetime(values).toordinal()
592-
except Exception:
593-
return values
594-
595-
if isinstance(values, (datetime.datetime, datetime.date)):
596-
return values.toordinal()
597-
elif isinstance(values, (datetime.time)):
598-
return dates.date2num(values)
599-
elif (com.is_integer(values) or com.is_float(values)):
600-
return values
601-
elif isinstance(values, str):
602-
return try_parse(values)
603-
elif isinstance(values, Index):
604-
return values.map(try_parse)
605-
elif isinstance(values, (list, tuple, np.ndarray)):
606-
return [try_parse(x) for x in values]
607-
return values
608-
609-
units.registry[lib.Timestamp] = DatetimeConverter()
610-
units.registry[datetime.date] = DatetimeConverter()
611-
units.registry[datetime.datetime] = DatetimeConverter()
612-
except ImportError:
613-
pass
614-
615589
class LinePlot(MPLPlot):
616590

617591
def __init__(self, data, **kwargs):

0 commit comments

Comments
 (0)