From bdc0d9f3b5171ccbf8f815965870f8612c10de31 Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Thu, 11 Dec 2014 11:25:40 +0100 Subject: [PATCH 1/2] TST: start tests for PeriodConverter --- pandas/tseries/tests/test_converter.py | 58 +++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/pandas/tseries/tests/test_converter.py b/pandas/tseries/tests/test_converter.py index b5a284d5f50ea..9a57b66f4c5c9 100644 --- a/pandas/tseries/tests/test_converter.py +++ b/pandas/tseries/tests/test_converter.py @@ -6,7 +6,7 @@ import numpy as np from numpy.testing import assert_almost_equal as np_assert_almost_equal -from pandas import Timestamp +from pandas import Timestamp, Period from pandas.compat import u import pandas.util.testing as tm from pandas.tseries.offsets import Second, Milli, Micro @@ -103,6 +103,62 @@ def _assert_less(ts1, ts2): _assert_less(ts, ts + Micro(50)) +class TestPeriodConverter(tm.TestCase): + + def setUp(self): + self.pc = converter.PeriodConverter() + + class Axis(object): + pass + + self.axis = Axis() + self.axis.freq = 'D' + + def test_convert_accepts_unicode(self): + # FIXME + raise nose.SkipTest("PeriodConverter does not yet handle unicode") + r1 = self.pc.convert("2012-1-1", None, self.axis) + r2 = self.pc.convert(u("2012-1-1"), None, self.axis) + self.assert_equal(r1, r2, "PeriodConverter.convert should accept unicode") + + def test_conversion(self): + rs = self.pc.convert(['2012-1-1'], None, self.axis)[0] + xp = Period('2012-1-1').ordinal + self.assertEqual(rs, xp) + + rs = self.pc.convert('2012-1-1', None, self.axis) + self.assertEqual(rs, xp) + + rs = self.pc.convert([date(2012, 1, 1)], None, self.axis)[0] + self.assertEqual(rs, xp) + + rs = self.pc.convert(date(2012, 1, 1), None, self.axis) + self.assertEqual(rs, xp) + + rs = self.pc.convert([Timestamp('2012-1-1')], None, self.axis)[0] + self.assertEqual(rs, xp) + + rs = self.pc.convert(Timestamp('2012-1-1'), None, self.axis) + self.assertEqual(rs, xp) + + # FIXME + # rs = self.pc.convert(np.datetime64('2012-01-01'), None, self.axis) + # self.assertEqual(rs, xp) + # + # rs = self.pc.convert(np.datetime64('2012-01-01 00:00:00+00:00'), None, self.axis) + # self.assertEqual(rs, xp) + # + # rs = self.pc.convert(np.array([np.datetime64('2012-01-01 00:00:00+00:00'), + # np.datetime64('2012-01-02 00:00:00+00:00')]), None, self.axis) + # self.assertEqual(rs[0], xp) + + def test_integer_passthrough(self): + # GH9012 + rs = self.pc.convert([0, 1], None, self.axis) + xp = [0, 1] + self.assertEqual(rs, xp) + + if __name__ == '__main__': import nose nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'], From 29cb1f75c27c4ace27f838151e6b6a7d6a257ba8 Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Fri, 12 Dec 2014 15:13:49 +0100 Subject: [PATCH 2/2] FIX PeriodConverter unicode parsing --- pandas/tseries/converter.py | 4 ++-- pandas/tseries/tests/test_converter.py | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/pandas/tseries/converter.py b/pandas/tseries/converter.py index 03a3d450827b9..a9fee1d5c3ee6 100644 --- a/pandas/tseries/converter.py +++ b/pandas/tseries/converter.py @@ -109,7 +109,7 @@ class PeriodConverter(dates.DateConverter): def convert(values, units, axis): if not hasattr(axis, 'freq'): raise TypeError('Axis must have `freq` set to convert to Periods') - valid_types = (str, datetime, Period, pydt.date, pydt.time) + valid_types = (compat.string_types, datetime, Period, pydt.date, pydt.time) if (isinstance(values, valid_types) or com.is_integer(values) or com.is_float(values)): return get_datevalue(values, axis.freq) @@ -127,7 +127,7 @@ def convert(values, units, axis): def get_datevalue(date, freq): if isinstance(date, Period): return date.asfreq(freq).ordinal - elif isinstance(date, (str, datetime, pydt.date, pydt.time)): + elif isinstance(date, (compat.string_types, datetime, pydt.date, pydt.time)): return Period(date, freq).ordinal elif (com.is_integer(date) or com.is_float(date) or (isinstance(date, (np.ndarray, Index)) and (date.size == 1))): diff --git a/pandas/tseries/tests/test_converter.py b/pandas/tseries/tests/test_converter.py index 9a57b66f4c5c9..95c0b4466da26 100644 --- a/pandas/tseries/tests/test_converter.py +++ b/pandas/tseries/tests/test_converter.py @@ -115,8 +115,6 @@ class Axis(object): self.axis.freq = 'D' def test_convert_accepts_unicode(self): - # FIXME - raise nose.SkipTest("PeriodConverter does not yet handle unicode") r1 = self.pc.convert("2012-1-1", None, self.axis) r2 = self.pc.convert(u("2012-1-1"), None, self.axis) self.assert_equal(r1, r2, "PeriodConverter.convert should accept unicode")