|
3 | 3 | import numpy as np
|
4 | 4 | import pytest
|
5 | 5 |
|
6 |
| -from pandas import DataFrame, DatetimeIndex, Index, MultiIndex, Series, date_range |
| 6 | +from pandas import ( |
| 7 | + DataFrame, |
| 8 | + DatetimeIndex, |
| 9 | + Index, |
| 10 | + MultiIndex, |
| 11 | + Series, |
| 12 | + date_range, |
| 13 | + period_range, |
| 14 | + to_datetime, |
| 15 | +) |
7 | 16 | import pandas._testing as tm
|
8 | 17 |
|
9 | 18 |
|
@@ -352,6 +361,112 @@ def test_construction_with_categorical_index(self):
|
352 | 361 | idf = idf.reset_index().set_index("B")
|
353 | 362 | tm.assert_index_equal(idf.index, ci)
|
354 | 363 |
|
| 364 | + def test_set_index_datetime(self): |
| 365 | + # GH#3950 |
| 366 | + df = DataFrame( |
| 367 | + { |
| 368 | + "label": ["a", "a", "a", "b", "b", "b"], |
| 369 | + "datetime": [ |
| 370 | + "2011-07-19 07:00:00", |
| 371 | + "2011-07-19 08:00:00", |
| 372 | + "2011-07-19 09:00:00", |
| 373 | + "2011-07-19 07:00:00", |
| 374 | + "2011-07-19 08:00:00", |
| 375 | + "2011-07-19 09:00:00", |
| 376 | + ], |
| 377 | + "value": range(6), |
| 378 | + } |
| 379 | + ) |
| 380 | + df.index = to_datetime(df.pop("datetime"), utc=True) |
| 381 | + df.index = df.index.tz_convert("US/Pacific") |
| 382 | + |
| 383 | + expected = DatetimeIndex( |
| 384 | + ["2011-07-19 07:00:00", "2011-07-19 08:00:00", "2011-07-19 09:00:00"], |
| 385 | + name="datetime", |
| 386 | + ) |
| 387 | + expected = expected.tz_localize("UTC").tz_convert("US/Pacific") |
| 388 | + |
| 389 | + df = df.set_index("label", append=True) |
| 390 | + tm.assert_index_equal(df.index.levels[0], expected) |
| 391 | + tm.assert_index_equal(df.index.levels[1], Index(["a", "b"], name="label")) |
| 392 | + assert df.index.names == ["datetime", "label"] |
| 393 | + |
| 394 | + df = df.swaplevel(0, 1) |
| 395 | + tm.assert_index_equal(df.index.levels[0], Index(["a", "b"], name="label")) |
| 396 | + tm.assert_index_equal(df.index.levels[1], expected) |
| 397 | + assert df.index.names == ["label", "datetime"] |
| 398 | + |
| 399 | + df = DataFrame(np.random.random(6)) |
| 400 | + idx1 = DatetimeIndex( |
| 401 | + [ |
| 402 | + "2011-07-19 07:00:00", |
| 403 | + "2011-07-19 08:00:00", |
| 404 | + "2011-07-19 09:00:00", |
| 405 | + "2011-07-19 07:00:00", |
| 406 | + "2011-07-19 08:00:00", |
| 407 | + "2011-07-19 09:00:00", |
| 408 | + ], |
| 409 | + tz="US/Eastern", |
| 410 | + ) |
| 411 | + idx2 = DatetimeIndex( |
| 412 | + [ |
| 413 | + "2012-04-01 09:00", |
| 414 | + "2012-04-01 09:00", |
| 415 | + "2012-04-01 09:00", |
| 416 | + "2012-04-02 09:00", |
| 417 | + "2012-04-02 09:00", |
| 418 | + "2012-04-02 09:00", |
| 419 | + ], |
| 420 | + tz="US/Eastern", |
| 421 | + ) |
| 422 | + idx3 = date_range("2011-01-01 09:00", periods=6, tz="Asia/Tokyo") |
| 423 | + idx3 = idx3._with_freq(None) |
| 424 | + |
| 425 | + df = df.set_index(idx1) |
| 426 | + df = df.set_index(idx2, append=True) |
| 427 | + df = df.set_index(idx3, append=True) |
| 428 | + |
| 429 | + expected1 = DatetimeIndex( |
| 430 | + ["2011-07-19 07:00:00", "2011-07-19 08:00:00", "2011-07-19 09:00:00"], |
| 431 | + tz="US/Eastern", |
| 432 | + ) |
| 433 | + expected2 = DatetimeIndex( |
| 434 | + ["2012-04-01 09:00", "2012-04-02 09:00"], tz="US/Eastern" |
| 435 | + ) |
| 436 | + |
| 437 | + tm.assert_index_equal(df.index.levels[0], expected1) |
| 438 | + tm.assert_index_equal(df.index.levels[1], expected2) |
| 439 | + tm.assert_index_equal(df.index.levels[2], idx3) |
| 440 | + |
| 441 | + # GH#7092 |
| 442 | + tm.assert_index_equal(df.index.get_level_values(0), idx1) |
| 443 | + tm.assert_index_equal(df.index.get_level_values(1), idx2) |
| 444 | + tm.assert_index_equal(df.index.get_level_values(2), idx3) |
| 445 | + |
| 446 | + def test_set_index_period(self): |
| 447 | + # GH#6631 |
| 448 | + df = DataFrame(np.random.random(6)) |
| 449 | + idx1 = period_range("2011-01-01", periods=3, freq="M") |
| 450 | + idx1 = idx1.append(idx1) |
| 451 | + idx2 = period_range("2013-01-01 09:00", periods=2, freq="H") |
| 452 | + idx2 = idx2.append(idx2).append(idx2) |
| 453 | + idx3 = period_range("2005", periods=6, freq="A") |
| 454 | + |
| 455 | + df = df.set_index(idx1) |
| 456 | + df = df.set_index(idx2, append=True) |
| 457 | + df = df.set_index(idx3, append=True) |
| 458 | + |
| 459 | + expected1 = period_range("2011-01-01", periods=3, freq="M") |
| 460 | + expected2 = period_range("2013-01-01 09:00", periods=2, freq="H") |
| 461 | + |
| 462 | + tm.assert_index_equal(df.index.levels[0], expected1) |
| 463 | + tm.assert_index_equal(df.index.levels[1], expected2) |
| 464 | + tm.assert_index_equal(df.index.levels[2], idx3) |
| 465 | + |
| 466 | + tm.assert_index_equal(df.index.get_level_values(0), idx1) |
| 467 | + tm.assert_index_equal(df.index.get_level_values(1), idx2) |
| 468 | + tm.assert_index_equal(df.index.get_level_values(2), idx3) |
| 469 | + |
355 | 470 |
|
356 | 471 | class TestSetIndexInvalid:
|
357 | 472 | def test_set_index_verify_integrity(self, frame_of_index_cols):
|
|
0 commit comments