|
7 | 7 | import dateutil
|
8 | 8 | import numpy as np
|
9 | 9 | from dateutil.parser import parse
|
10 |
| -from datetime import datetime, date, time |
| 10 | +from datetime import datetime, time |
11 | 11 | from distutils.version import LooseVersion
|
12 | 12 |
|
13 | 13 | import pandas as pd
|
@@ -1251,92 +1251,90 @@ def test_day_not_in_month_ignore(self, cache):
|
1251 | 1251 |
|
1252 | 1252 | class TestDatetimeParsingWrappers(object):
|
1253 | 1253 |
|
| 1254 | + @pytest.mark.parametrize('date_str,expected', list({ |
| 1255 | + '2011-01-01': datetime(2011, 1, 1), |
| 1256 | + '2Q2005': datetime(2005, 4, 1), |
| 1257 | + '2Q05': datetime(2005, 4, 1), |
| 1258 | + '2005Q1': datetime(2005, 1, 1), |
| 1259 | + '05Q1': datetime(2005, 1, 1), |
| 1260 | + '2011Q3': datetime(2011, 7, 1), |
| 1261 | + '11Q3': datetime(2011, 7, 1), |
| 1262 | + '3Q2011': datetime(2011, 7, 1), |
| 1263 | + '3Q11': datetime(2011, 7, 1), |
| 1264 | +
|
| 1265 | + # quarterly without space |
| 1266 | + '2000Q4': datetime(2000, 10, 1), |
| 1267 | + '00Q4': datetime(2000, 10, 1), |
| 1268 | + '4Q2000': datetime(2000, 10, 1), |
| 1269 | + '4Q00': datetime(2000, 10, 1), |
| 1270 | + '2000q4': datetime(2000, 10, 1), |
| 1271 | + '2000-Q4': datetime(2000, 10, 1), |
| 1272 | + '00-Q4': datetime(2000, 10, 1), |
| 1273 | + '4Q-2000': datetime(2000, 10, 1), |
| 1274 | + '4Q-00': datetime(2000, 10, 1), |
| 1275 | + '00q4': datetime(2000, 10, 1), |
| 1276 | + '2005': datetime(2005, 1, 1), |
| 1277 | + '2005-11': datetime(2005, 11, 1), |
| 1278 | + '2005 11': datetime(2005, 11, 1), |
| 1279 | + '11-2005': datetime(2005, 11, 1), |
| 1280 | + '11 2005': datetime(2005, 11, 1), |
| 1281 | + '200511': datetime(2020, 5, 11), |
| 1282 | + '20051109': datetime(2005, 11, 9), |
| 1283 | + '20051109 10:15': datetime(2005, 11, 9, 10, 15), |
| 1284 | + '20051109 08H': datetime(2005, 11, 9, 8, 0), |
| 1285 | + '2005-11-09 10:15': datetime(2005, 11, 9, 10, 15), |
| 1286 | + '2005-11-09 08H': datetime(2005, 11, 9, 8, 0), |
| 1287 | + '2005/11/09 10:15': datetime(2005, 11, 9, 10, 15), |
| 1288 | + '2005/11/09 08H': datetime(2005, 11, 9, 8, 0), |
| 1289 | + "Thu Sep 25 10:36:28 2003": datetime(2003, 9, 25, 10, 36, 28), |
| 1290 | + "Thu Sep 25 2003": datetime(2003, 9, 25), |
| 1291 | + "Sep 25 2003": datetime(2003, 9, 25), |
| 1292 | + "January 1 2014": datetime(2014, 1, 1), |
| 1293 | +
|
| 1294 | + # GHE10537 |
| 1295 | + '2014-06': datetime(2014, 6, 1), |
| 1296 | + '06-2014': datetime(2014, 6, 1), |
| 1297 | + '2014-6': datetime(2014, 6, 1), |
| 1298 | + '6-2014': datetime(2014, 6, 1), |
| 1299 | +
|
| 1300 | + '20010101 12': datetime(2001, 1, 1, 12), |
| 1301 | + '20010101 1234': datetime(2001, 1, 1, 12, 34), |
| 1302 | + '20010101 123456': datetime(2001, 1, 1, 12, 34, 56)}.items())) |
1254 | 1303 | @pytest.mark.parametrize('cache', [True, False])
|
1255 |
| - def test_parsers(self, cache): |
| 1304 | + def test_parsers(self, date_str, expected, cache): |
1256 | 1305 |
|
1257 | 1306 | # dateutil >= 2.5.0 defaults to yearfirst=True
|
1258 | 1307 | # https://github.com/dateutil/dateutil/issues/217
|
1259 | 1308 | yearfirst = True
|
1260 | 1309 |
|
1261 |
| - cases = {'2011-01-01': datetime(2011, 1, 1), |
1262 |
| - '2Q2005': datetime(2005, 4, 1), |
1263 |
| - '2Q05': datetime(2005, 4, 1), |
1264 |
| - '2005Q1': datetime(2005, 1, 1), |
1265 |
| - '05Q1': datetime(2005, 1, 1), |
1266 |
| - '2011Q3': datetime(2011, 7, 1), |
1267 |
| - '11Q3': datetime(2011, 7, 1), |
1268 |
| - '3Q2011': datetime(2011, 7, 1), |
1269 |
| - '3Q11': datetime(2011, 7, 1), |
1270 |
| - |
1271 |
| - # quarterly without space |
1272 |
| - '2000Q4': datetime(2000, 10, 1), |
1273 |
| - '00Q4': datetime(2000, 10, 1), |
1274 |
| - '4Q2000': datetime(2000, 10, 1), |
1275 |
| - '4Q00': datetime(2000, 10, 1), |
1276 |
| - '2000q4': datetime(2000, 10, 1), |
1277 |
| - '2000-Q4': datetime(2000, 10, 1), |
1278 |
| - '00-Q4': datetime(2000, 10, 1), |
1279 |
| - '4Q-2000': datetime(2000, 10, 1), |
1280 |
| - '4Q-00': datetime(2000, 10, 1), |
1281 |
| - '00q4': datetime(2000, 10, 1), |
1282 |
| - '2005': datetime(2005, 1, 1), |
1283 |
| - '2005-11': datetime(2005, 11, 1), |
1284 |
| - '2005 11': datetime(2005, 11, 1), |
1285 |
| - '11-2005': datetime(2005, 11, 1), |
1286 |
| - '11 2005': datetime(2005, 11, 1), |
1287 |
| - '200511': datetime(2020, 5, 11), |
1288 |
| - '20051109': datetime(2005, 11, 9), |
1289 |
| - '20051109 10:15': datetime(2005, 11, 9, 10, 15), |
1290 |
| - '20051109 08H': datetime(2005, 11, 9, 8, 0), |
1291 |
| - '2005-11-09 10:15': datetime(2005, 11, 9, 10, 15), |
1292 |
| - '2005-11-09 08H': datetime(2005, 11, 9, 8, 0), |
1293 |
| - '2005/11/09 10:15': datetime(2005, 11, 9, 10, 15), |
1294 |
| - '2005/11/09 08H': datetime(2005, 11, 9, 8, 0), |
1295 |
| - "Thu Sep 25 10:36:28 2003": datetime(2003, 9, 25, 10, |
1296 |
| - 36, 28), |
1297 |
| - "Thu Sep 25 2003": datetime(2003, 9, 25), |
1298 |
| - "Sep 25 2003": datetime(2003, 9, 25), |
1299 |
| - "January 1 2014": datetime(2014, 1, 1), |
1300 |
| - |
1301 |
| - # GH 10537 |
1302 |
| - '2014-06': datetime(2014, 6, 1), |
1303 |
| - '06-2014': datetime(2014, 6, 1), |
1304 |
| - '2014-6': datetime(2014, 6, 1), |
1305 |
| - '6-2014': datetime(2014, 6, 1), |
1306 |
| - |
1307 |
| - '20010101 12': datetime(2001, 1, 1, 12), |
1308 |
| - '20010101 1234': datetime(2001, 1, 1, 12, 34), |
1309 |
| - '20010101 123456': datetime(2001, 1, 1, 12, 34, 56), |
1310 |
| - } |
1311 |
| - |
1312 |
| - for date_str, expected in compat.iteritems(cases): |
1313 |
| - result1, _, _ = parsing.parse_time_string(date_str, |
1314 |
| - yearfirst=yearfirst) |
1315 |
| - result2 = to_datetime(date_str, yearfirst=yearfirst) |
1316 |
| - result3 = to_datetime([date_str], yearfirst=yearfirst) |
1317 |
| - # result5 is used below |
1318 |
| - result4 = to_datetime(np.array([date_str], dtype=object), |
1319 |
| - yearfirst=yearfirst, cache=cache) |
1320 |
| - result6 = DatetimeIndex([date_str], yearfirst=yearfirst) |
1321 |
| - # result7 is used below |
1322 |
| - result8 = DatetimeIndex(Index([date_str]), yearfirst=yearfirst) |
1323 |
| - result9 = DatetimeIndex(Series([date_str]), yearfirst=yearfirst) |
1324 |
| - |
1325 |
| - for res in [result1, result2]: |
1326 |
| - assert res == expected |
1327 |
| - for res in [result3, result4, result6, result8, result9]: |
1328 |
| - exp = DatetimeIndex([pd.Timestamp(expected)]) |
1329 |
| - tm.assert_index_equal(res, exp) |
1330 |
| - |
1331 |
| - # these really need to have yearfirst, but we don't support |
1332 |
| - if not yearfirst: |
1333 |
| - result5 = Timestamp(date_str) |
1334 |
| - assert result5 == expected |
1335 |
| - result7 = date_range(date_str, freq='S', periods=1, |
1336 |
| - yearfirst=yearfirst) |
1337 |
| - assert result7 == expected |
1338 |
| - |
1339 |
| - # NaT |
| 1310 | + result1, _, _ = parsing.parse_time_string(date_str, |
| 1311 | + yearfirst=yearfirst) |
| 1312 | + result2 = to_datetime(date_str, yearfirst=yearfirst) |
| 1313 | + result3 = to_datetime([date_str], yearfirst=yearfirst) |
| 1314 | + # result5 is used below |
| 1315 | + result4 = to_datetime(np.array([date_str], dtype=object), |
| 1316 | + yearfirst=yearfirst, cache=cache) |
| 1317 | + result6 = DatetimeIndex([date_str], yearfirst=yearfirst) |
| 1318 | + # result7 is used below |
| 1319 | + result8 = DatetimeIndex(Index([date_str]), yearfirst=yearfirst) |
| 1320 | + result9 = DatetimeIndex(Series([date_str]), yearfirst=yearfirst) |
| 1321 | + |
| 1322 | + for res in [result1, result2]: |
| 1323 | + assert res == expected |
| 1324 | + for res in [result3, result4, result6, result8, result9]: |
| 1325 | + exp = DatetimeIndex([pd.Timestamp(expected)]) |
| 1326 | + tm.assert_index_equal(res, exp) |
| 1327 | + |
| 1328 | + # these really need to have yearfirst, but we don't support |
| 1329 | + if not yearfirst: |
| 1330 | + result5 = Timestamp(date_str) |
| 1331 | + assert result5 == expected |
| 1332 | + result7 = date_range(date_str, freq='S', periods=1, |
| 1333 | + yearfirst=yearfirst) |
| 1334 | + assert result7 == expected |
| 1335 | + |
| 1336 | + def test_parsers_nat(self): |
| 1337 | + # Test that each of several string-accepting methods return pd.NaT |
1340 | 1338 | result1, _, _ = parsing.parse_time_string('NaT')
|
1341 | 1339 | result2 = to_datetime('NaT')
|
1342 | 1340 | result3 = Timestamp('NaT')
|
@@ -1516,18 +1514,6 @@ def test_parsers_timezone_minute_offsets_roundtrip(self, cache):
|
1516 | 1514 | assert dt_string_repr == repr(converted_time)
|
1517 | 1515 |
|
1518 | 1516 |
|
1519 |
| -def test_normalize_date(): |
1520 |
| - value = date(2012, 9, 7) |
1521 |
| - |
1522 |
| - result = tslib.normalize_date(value) |
1523 |
| - assert (result == datetime(2012, 9, 7)) |
1524 |
| - |
1525 |
| - value = datetime(2012, 9, 7, 12) |
1526 |
| - |
1527 |
| - result = tslib.normalize_date(value) |
1528 |
| - assert (result == datetime(2012, 9, 7)) |
1529 |
| - |
1530 |
| - |
1531 | 1517 | @pytest.fixture(params=['D', 's', 'ms', 'us', 'ns'])
|
1532 | 1518 | def units(request):
|
1533 | 1519 | return request.param
|
|
0 commit comments