Skip to content

Commit b5535b9

Browse files
RomanPekarjreback
authored andcommitted
API: added 'p' code into _parse_code_table (GH5361)
1 parent 3d10a2b commit b5535b9

File tree

3 files changed

+81
-95
lines changed

3 files changed

+81
-95
lines changed

doc/source/release.rst

+3-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ API Changes
6666
timedeltas (:issue:`5458`,:issue:`5689`)
6767
- Add ``-NaN`` and ``-nan`` to the default set of NA values
6868
(:issue:`5952`). See :ref:`NA Values <io.na_values>`.
69-
- ``NDFrame`` now has an ``equals`` method. (:issue:`5283`)
69+
- ``NDFrame`` now has an ``equals`` method. (:issue:`5283`)
7070

7171
Experimental Features
7272
~~~~~~~~~~~~~~~~~~~~~
@@ -95,6 +95,8 @@ Improvements to existing features
9595
- pd.to_csv and pd.to_datetime learned a new ``infer_datetime_format`` keyword which greatly
9696
improves parsing perf in many cases. Thanks to @lexual for suggesting and @danbirken
9797
for rapidly implementing. (:issue:`5490`,:issue:`6021`)
98+
- add ability to recognize '%p' format code (am/pm) to date parsers when the specific format
99+
is supplied (:issue:`5361`)
98100

99101
.. _release.bug_fixes-0.13.1:
100102

pandas/tseries/tests/test_timeseries.py

+76-93
Original file line numberDiff line numberDiff line change
@@ -810,103 +810,10 @@ def test_to_datetime_default(self):
810810
xp = datetime(2001, 1, 1)
811811
self.assert_(rs, xp)
812812

813-
814-
def test_to_datetime_mixed(self):
815-
816-
# 5863
817-
# passing a string format with embedded np.nan
818-
819-
ts = Series([np.nan, '2013-04-08 00:00:00.000', '9999-12-31 00:00:00.000'])
820-
expected = Series([NaT,Timestamp('20130408'),NaT])
821-
822-
result = to_datetime(ts, format='%Y-%m-%d %H:%M:%S.%f')
823-
assert_series_equal(result, ts)
824-
825-
# raises if specified
826-
self.assertRaises(pd.tslib.OutOfBoundsDatetime, to_datetime, ts, format='%Y-%m-%d %H:%M:%S.%f', errors='raise')
827-
828-
result = to_datetime(ts, format='%Y-%m-%d %H:%M:%S.%f',coerce=True)
829-
expected = Series([NaT,Timestamp('20130408'),NaT])
830-
assert_series_equal(result,expected)
831-
832-
# passing integers
833-
ts = Series([np.nan, 20130408, '20130409'])
834-
result = to_datetime(ts, format='%Y%m%d')
835-
expected = Series([NaT,Timestamp('20130408'),Timestamp('20130409')])
836-
assert_series_equal(result,expected)
837-
838-
# mixed datetime/np.datetime64('NaT')
839-
result = Series(to_datetime([dt.datetime(2000,1,1),np.datetime64('NaT')]))
840-
expected = Series([dt.datetime(2000,1,1),NaT])
841-
assert_series_equal(result, expected)
842-
843-
def test_dayfirst(self):
844-
845-
# GH 3341
846-
result = to_datetime('13-01-2012', dayfirst=True)
847-
expected = Timestamp('20120113')
848-
self.assert_(result == expected)
849-
850813
#### dayfirst is essentially broken
851814
#### to_datetime('01-13-2012', dayfirst=True)
852815
#### self.assertRaises(ValueError, to_datetime('01-13-2012', dayfirst=True))
853816

854-
def test_to_datetime_format(self):
855-
values = ['1/1/2000', '1/2/2000', '1/3/2000']
856-
857-
results1 = [ Timestamp('20000101'), Timestamp('20000201'),
858-
Timestamp('20000301') ]
859-
results2 = [ Timestamp('20000101'), Timestamp('20000102'),
860-
Timestamp('20000103') ]
861-
for vals, expecteds in [ (values, (Index(results1), Index(results2))),
862-
(Series(values),(Series(results1), Series(results2))),
863-
(values[0], (results1[0], results2[0])),
864-
(values[1], (results1[1], results2[1])),
865-
(values[2], (results1[2], results2[2])) ]:
866-
867-
for i, fmt in enumerate(['%d/%m/%Y', '%m/%d/%Y']):
868-
result = to_datetime(vals, format=fmt)
869-
expected = expecteds[i]
870-
871-
if isinstance(expected, Series):
872-
assert_series_equal(result, Series(expected))
873-
elif isinstance(expected, Timestamp):
874-
self.assert_(result == expected)
875-
else:
876-
self.assert_(result.equals(expected))
877-
878-
def test_to_datetime_format_YYYYMMDD(self):
879-
s = Series([19801222,19801222] + [19810105]*5)
880-
expected = Series([ Timestamp(x) for x in s.apply(str) ])
881-
882-
result = to_datetime(s,format='%Y%m%d')
883-
assert_series_equal(result, expected)
884-
885-
result = to_datetime(s.apply(str),format='%Y%m%d')
886-
assert_series_equal(result, expected)
887-
888-
# with NaT
889-
expected = Series([Timestamp("19801222"),Timestamp("19801222")] + [Timestamp("19810105")]*5)
890-
expected[2] = np.nan
891-
s[2] = np.nan
892-
893-
result = to_datetime(s,format='%Y%m%d')
894-
assert_series_equal(result, expected)
895-
896-
# string with NaT
897-
s = s.apply(str)
898-
s[2] = 'nat'
899-
result = to_datetime(s,format='%Y%m%d')
900-
assert_series_equal(result, expected)
901-
902-
903-
def test_to_datetime_format_microsecond(self):
904-
val = '01-Apr-2011 00:00:01.978'
905-
format = '%d-%b-%Y %H:%M:%S.%f'
906-
result = to_datetime(val, format=format)
907-
exp = dt.datetime.strptime(val, format)
908-
self.assert_(result == exp)
909-
910817
def test_to_datetime_on_datetime64_series(self):
911818
# #2699
912819
s = Series(date_range('1/1/2000', periods=10))
@@ -3125,6 +3032,82 @@ def test_date_range_fy5252(self):
31253032
self.assertEqual(dr[0], Timestamp('2013-01-31'))
31263033
self.assertEqual(dr[1], Timestamp('2014-01-30'))
31273034

3035+
class TimeConversionFormats(tm.TestCase):
3036+
def test_to_datetime_format(self):
3037+
values = ['1/1/2000', '1/2/2000', '1/3/2000']
3038+
3039+
results1 = [ Timestamp('20000101'), Timestamp('20000201'),
3040+
Timestamp('20000301') ]
3041+
results2 = [ Timestamp('20000101'), Timestamp('20000102'),
3042+
Timestamp('20000103') ]
3043+
for vals, expecteds in [ (values, (Index(results1), Index(results2))),
3044+
(Series(values),(Series(results1), Series(results2))),
3045+
(values[0], (results1[0], results2[0])),
3046+
(values[1], (results1[1], results2[1])),
3047+
(values[2], (results1[2], results2[2])) ]:
3048+
3049+
for i, fmt in enumerate(['%d/%m/%Y', '%m/%d/%Y']):
3050+
result = to_datetime(vals, format=fmt)
3051+
expected = expecteds[i]
3052+
3053+
if isinstance(expected, Series):
3054+
assert_series_equal(result, Series(expected))
3055+
elif isinstance(expected, Timestamp):
3056+
self.assert_(result == expected)
3057+
else:
3058+
self.assert_(result.equals(expected))
3059+
3060+
def test_to_datetime_format_YYYYMMDD(self):
3061+
s = Series([19801222,19801222] + [19810105]*5)
3062+
expected = Series([ Timestamp(x) for x in s.apply(str) ])
3063+
3064+
result = to_datetime(s,format='%Y%m%d')
3065+
assert_series_equal(result, expected)
3066+
3067+
result = to_datetime(s.apply(str),format='%Y%m%d')
3068+
assert_series_equal(result, expected)
3069+
3070+
# with NaT
3071+
expected = Series([Timestamp("19801222"),Timestamp("19801222")] + [Timestamp("19810105")]*5)
3072+
expected[2] = np.nan
3073+
s[2] = np.nan
3074+
3075+
result = to_datetime(s,format='%Y%m%d')
3076+
assert_series_equal(result, expected)
3077+
3078+
# string with NaT
3079+
s = s.apply(str)
3080+
s[2] = 'nat'
3081+
result = to_datetime(s,format='%Y%m%d')
3082+
assert_series_equal(result, expected)
3083+
3084+
3085+
def test_to_datetime_format_microsecond(self):
3086+
val = '01-Apr-2011 00:00:01.978'
3087+
format = '%d-%b-%Y %H:%M:%S.%f'
3088+
result = to_datetime(val, format=format)
3089+
exp = dt.datetime.strptime(val, format)
3090+
self.assert_(result == exp)
3091+
3092+
def test_to_datetime_format_time(self):
3093+
data = [
3094+
['01/10/2010 15:20', '%m/%d/%Y %H:%M', Timestamp('2010-01-10 15:20')],
3095+
['01/10/2010 05:43', '%m/%d/%Y %I:%M', Timestamp('2010-01-10 05:43')],
3096+
['01/10/2010 13:56:01', '%m/%d/%Y %H:%M:%S', Timestamp('2010-01-10 13:56:01')]#,
3097+
#['01/10/2010 08:14 PM', '%m/%d/%Y %I:%M %p', Timestamp('2010-01-10 20:14')],
3098+
#['01/10/2010 07:40 AM', '%m/%d/%Y %I:%M %p', Timestamp('2010-01-10 07:40')],
3099+
#['01/10/2010 09:12:56 AM', '%m/%d/%Y %I:%M:%S %p', Timestamp('2010-01-10 09:12:56')]
3100+
]
3101+
for s, format, dt in data:
3102+
self.assertEqual(to_datetime(s, format=format), dt)
3103+
3104+
def test_to_datetime_format_weeks(self):
3105+
data = [
3106+
['2009324', '%Y%W%w', Timestamp('2009-08-13')],
3107+
['2013020', '%Y%U%w', Timestamp('2013-01-13')]
3108+
]
3109+
for s, format, dt in data:
3110+
self.assertEqual(to_datetime(s, format=format), dt)
31283111

31293112
class TestToDatetimeInferFormat(tm.TestCase):
31303113
def test_to_datetime_infer_datetime_format_consistent_format(self):

pandas/tslib.pyx

+2-1
Original file line numberDiff line numberDiff line change
@@ -1367,7 +1367,8 @@ def array_strptime(ndarray[object] values, object fmt, coerce=False):
13671367
'j': 14,
13681368
'U': 15,
13691369
'W': 16,
1370-
'Z': 17
1370+
'Z': 17,
1371+
'p': 18 # just an additional key, works only with I
13711372
}
13721373
cdef int parse_code
13731374

0 commit comments

Comments
 (0)