Skip to content

Commit a2f5e56

Browse files
author
Chang She
committed
BUG: DatetimeConverter does not handle datetime64 arrays properly
1 parent 974136e commit a2f5e56

File tree

3 files changed

+45
-5
lines changed

3 files changed

+45
-5
lines changed

pandas/tseries/converter.py

+13-3
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ class DatetimeConverter(dates.DateConverter):
137137

138138
@staticmethod
139139
def convert(values, unit, axis):
140+
from pandas.tseries.index import DatetimeIndex
140141
def try_parse(values):
141142
try:
142143
return _dt_to_float_ordinal(tools.to_datetime(values))
@@ -151,10 +152,19 @@ def try_parse(values):
151152
return values
152153
elif isinstance(values, str):
153154
return try_parse(values)
154-
elif isinstance(values, Index):
155-
return values.map(try_parse)
156155
elif isinstance(values, (list, tuple, np.ndarray)):
157-
return [try_parse(x) for x in values]
156+
if not isinstance(values, np.ndarray):
157+
values = np.array(values, dtype='O')
158+
159+
try:
160+
values = tools.to_datetime(values)
161+
if isinstance(values, Index):
162+
values = values.map(_dt_to_float_ordinal)
163+
else:
164+
values = [_dt_to_float_ordinal(x) for x in values]
165+
except Exception:
166+
pass
167+
158168
return values
159169

160170
@staticmethod

pandas/tseries/tests/test_plotting.py

+13
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,9 @@ def _test(ax):
286286
self.assertEqual(int(result[0]), expected[0].ordinal)
287287
self.assertEqual(int(result[1]), expected[1].ordinal)
288288

289+
import matplotlib.pyplot as plt
290+
plt.close('all')
291+
289292
ser = tm.makeTimeSeries()
290293
ax = ser.plot()
291294
_test(ax)
@@ -840,6 +843,16 @@ def test_format_date_axis(self):
840843
if len(l.get_text()) > 0:
841844
self.assert_(l.get_rotation() == 30)
842845

846+
@slow
847+
def test_ax_plot(self):
848+
x = DatetimeIndex(start='2012-01-02', periods=10,
849+
freq='D')
850+
y = range(len(x))
851+
import matplotlib.pyplot as plt
852+
fig = plt.figure()
853+
ax = fig.add_subplot(111)
854+
lines = ax.plot(x, y, label='Y')
855+
assert_array_equal(DatetimeIndex(lines[0].get_xdata()), x)
843856

844857
PNG_PATH = 'tmp.png'
845858
def _check_plot_works(f, freq=None, series=None, *args, **kwargs):

pandas/tseries/tools.py

+19-2
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,25 @@ def _convert_f(arg):
9191
elif isinstance(arg, (np.ndarray, list)):
9292
if isinstance(arg, list):
9393
arg = np.array(arg, dtype='O')
94-
result = _convert_f(arg)
95-
return result
94+
95+
if com.is_datetime64_dtype(arg):
96+
if box and not isinstance(arg, DatetimeIndex):
97+
try:
98+
return DatetimeIndex(arg, tz='utc' if utc else None)
99+
except ValueError, e:
100+
try:
101+
values, tz = lib.datetime_to_datetime64(arg)
102+
return DatetimeIndex._simple_new(values, None, tz=tz)
103+
except (ValueError, TypeError):
104+
raise e
105+
return arg
106+
107+
try:
108+
return _convert_f(arg)
109+
except ValueError:
110+
raise
111+
return arg
112+
96113
try:
97114
if not arg:
98115
return arg

0 commit comments

Comments
 (0)