|
2 | 2 |
|
3 | 3 | from __future__ import print_function
|
4 | 4 |
|
5 |
| -from datetime import datetime |
| 5 | +from datetime import datetime, time |
6 | 6 |
|
7 | 7 | from numpy import nan
|
8 | 8 | from numpy.random import randn
|
|
20 | 20 | assertRaisesRegexp)
|
21 | 21 |
|
22 | 22 | import pandas.util.testing as tm
|
| 23 | +from pandas.compat import product |
23 | 24 |
|
24 | 25 | from pandas.tests.frame.common import TestData
|
25 | 26 |
|
@@ -418,6 +419,96 @@ def test_first_last_valid(self):
|
418 | 419 | self.assertIsNone(empty.last_valid_index())
|
419 | 420 | self.assertIsNone(empty.first_valid_index())
|
420 | 421 |
|
| 422 | + def test_at_time_frame(self): |
| 423 | + rng = date_range('1/1/2000', '1/5/2000', freq='5min') |
| 424 | + ts = DataFrame(np.random.randn(len(rng), 2), index=rng) |
| 425 | + rs = ts.at_time(rng[1]) |
| 426 | + self.assertTrue((rs.index.hour == rng[1].hour).all()) |
| 427 | + self.assertTrue((rs.index.minute == rng[1].minute).all()) |
| 428 | + self.assertTrue((rs.index.second == rng[1].second).all()) |
| 429 | + |
| 430 | + result = ts.at_time('9:30') |
| 431 | + expected = ts.at_time(time(9, 30)) |
| 432 | + assert_frame_equal(result, expected) |
| 433 | + |
| 434 | + result = ts.loc[time(9, 30)] |
| 435 | + expected = ts.loc[(rng.hour == 9) & (rng.minute == 30)] |
| 436 | + |
| 437 | + assert_frame_equal(result, expected) |
| 438 | + |
| 439 | + # midnight, everything |
| 440 | + rng = date_range('1/1/2000', '1/31/2000') |
| 441 | + ts = DataFrame(np.random.randn(len(rng), 3), index=rng) |
| 442 | + |
| 443 | + result = ts.at_time(time(0, 0)) |
| 444 | + assert_frame_equal(result, ts) |
| 445 | + |
| 446 | + # time doesn't exist |
| 447 | + rng = date_range('1/1/2012', freq='23Min', periods=384) |
| 448 | + ts = DataFrame(np.random.randn(len(rng), 2), rng) |
| 449 | + rs = ts.at_time('16:00') |
| 450 | + self.assertEqual(len(rs), 0) |
| 451 | + |
| 452 | + def test_between_time_frame(self): |
| 453 | + rng = date_range('1/1/2000', '1/5/2000', freq='5min') |
| 454 | + ts = DataFrame(np.random.randn(len(rng), 2), index=rng) |
| 455 | + stime = time(0, 0) |
| 456 | + etime = time(1, 0) |
| 457 | + |
| 458 | + close_open = product([True, False], [True, False]) |
| 459 | + for inc_start, inc_end in close_open: |
| 460 | + filtered = ts.between_time(stime, etime, inc_start, inc_end) |
| 461 | + exp_len = 13 * 4 + 1 |
| 462 | + if not inc_start: |
| 463 | + exp_len -= 5 |
| 464 | + if not inc_end: |
| 465 | + exp_len -= 4 |
| 466 | + |
| 467 | + self.assertEqual(len(filtered), exp_len) |
| 468 | + for rs in filtered.index: |
| 469 | + t = rs.time() |
| 470 | + if inc_start: |
| 471 | + self.assertTrue(t >= stime) |
| 472 | + else: |
| 473 | + self.assertTrue(t > stime) |
| 474 | + |
| 475 | + if inc_end: |
| 476 | + self.assertTrue(t <= etime) |
| 477 | + else: |
| 478 | + self.assertTrue(t < etime) |
| 479 | + |
| 480 | + result = ts.between_time('00:00', '01:00') |
| 481 | + expected = ts.between_time(stime, etime) |
| 482 | + assert_frame_equal(result, expected) |
| 483 | + |
| 484 | + # across midnight |
| 485 | + rng = date_range('1/1/2000', '1/5/2000', freq='5min') |
| 486 | + ts = DataFrame(np.random.randn(len(rng), 2), index=rng) |
| 487 | + stime = time(22, 0) |
| 488 | + etime = time(9, 0) |
| 489 | + |
| 490 | + close_open = product([True, False], [True, False]) |
| 491 | + for inc_start, inc_end in close_open: |
| 492 | + filtered = ts.between_time(stime, etime, inc_start, inc_end) |
| 493 | + exp_len = (12 * 11 + 1) * 4 + 1 |
| 494 | + if not inc_start: |
| 495 | + exp_len -= 4 |
| 496 | + if not inc_end: |
| 497 | + exp_len -= 4 |
| 498 | + |
| 499 | + self.assertEqual(len(filtered), exp_len) |
| 500 | + for rs in filtered.index: |
| 501 | + t = rs.time() |
| 502 | + if inc_start: |
| 503 | + self.assertTrue((t >= stime) or (t <= etime)) |
| 504 | + else: |
| 505 | + self.assertTrue((t > stime) or (t <= etime)) |
| 506 | + |
| 507 | + if inc_end: |
| 508 | + self.assertTrue((t <= etime) or (t >= stime)) |
| 509 | + else: |
| 510 | + self.assertTrue((t < etime) or (t >= stime)) |
| 511 | + |
421 | 512 | def test_operation_on_NaT(self):
|
422 | 513 | # Both NaT and Timestamp are in DataFrame.
|
423 | 514 | df = pd.DataFrame({'foo': [pd.NaT, pd.NaT,
|
@@ -457,6 +548,34 @@ def test_datetime_assignment_with_NaT_and_diff_time_units(self):
|
457 | 548 | 'new': [1e9, None]}, dtype='datetime64[ns]')
|
458 | 549 | tm.assert_frame_equal(result, expected)
|
459 | 550 |
|
| 551 | + def test_frame_to_period(self): |
| 552 | + K = 5 |
| 553 | + from pandas.tseries.period import period_range |
| 554 | + |
| 555 | + dr = date_range('1/1/2000', '1/1/2001') |
| 556 | + pr = period_range('1/1/2000', '1/1/2001') |
| 557 | + df = DataFrame(randn(len(dr), K), index=dr) |
| 558 | + df['mix'] = 'a' |
| 559 | + |
| 560 | + pts = df.to_period() |
| 561 | + exp = df.copy() |
| 562 | + exp.index = pr |
| 563 | + assert_frame_equal(pts, exp) |
| 564 | + |
| 565 | + pts = df.to_period('M') |
| 566 | + tm.assert_index_equal(pts.index, exp.index.asfreq('M')) |
| 567 | + |
| 568 | + df = df.T |
| 569 | + pts = df.to_period(axis=1) |
| 570 | + exp = df.copy() |
| 571 | + exp.columns = pr |
| 572 | + assert_frame_equal(pts, exp) |
| 573 | + |
| 574 | + pts = df.to_period('M', axis=1) |
| 575 | + tm.assert_index_equal(pts.columns, exp.columns.asfreq('M')) |
| 576 | + |
| 577 | + self.assertRaises(ValueError, df.to_period, axis=2) |
| 578 | + |
460 | 579 |
|
461 | 580 | if __name__ == '__main__':
|
462 | 581 | import nose
|
|
0 commit comments