панды мульти-индекс целых чисел для индекса даты и времени? - PullRequest
0 голосов
/ 29 октября 2018

У меня есть датафрейм, подобный следующему, с мультииндексом целых чисел, который представляет месяцы и дни года, а также записи максимальной и минимальной температуры за эти дни.

df

          Min Temp  Max Temp
Date Date                    
1    1          -88       139
     2         -115       150
     3         -110       139
     4          -81       156
     5          -80       172
...             ...       ...
12   2          -94       156
     3          -97       172
     4         -120       156
     5         -124       144
     6         -161       130
     7         -167       135
     8         -141       167
     9         -135       178
     10        -106       194
     11        -106       161
     12         -94       144
     13         -92       133
     14        -149       117
     15        -158       117
     16        -119       122
     17        -111       160
     18        -142       133
     19        -185       130
     20        -190       161
     21        -167       161
     22         -98       150
     23        -162       139
     24         -90       183
     25        -125       183
     26        -119       144
     27         -76       130
     28         -81       134
     29        -117       113
     30        -127       106
     31        -111       122

Как я могу преобразовать этот мультииндекс в один индекс типа datetime? Что-то вроде этого преобразования - это то, что я ищу:

1 1 ---> January 1
1 2 ---> January 2
...
12 31 ---> December 31

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Используя верх вашего фрейма данных в качестве примера:

>>> df
           Min Temp  Max Temp
Date Date                    
1    1          -88       139
     2         -115       150
     3         -110       139
     4          -81       156
     5          -80       172

Используйте pd.to_datetime на отдельных уровнях вашего MultiIndex, затем strftime с желаемым форматом:

df.index = pd.to_datetime(df.index.get_level_values(0).astype(str) + '-' +
               df.index.get_level_values(1).astype(str),
               format='%m-%d').strftime('%B %d')

>>> df
            Min Temp  Max Temp
January 01       -88       139
January 02      -115       150
January 03      -110       139
January 04       -81       156
January 05       -80       172

Однако, поскольку это отформатированная строка, она больше не будет форматом даты и времени. Если вы хотите, чтобы это было время, вам нужно указать год. Вы можете опустить strftime, и он будет использовать значение по умолчанию 1900:

df.index = pd.to_datetime(df.index.get_level_values(0).astype(str) + '-' +
               df.index.get_level_values(1).astype(str),
               format='%m-%d')

>>> df
            Min Temp  Max Temp
1900-01-01       -88       139
1900-01-02      -115       150
1900-01-03      -110       139
1900-01-04       -81       156
1900-01-05       -80       172
0 голосов
/ 29 октября 2018

Давайте возьмем этот пример кадра данных:

import pandas as pd
import numpy as np

arrays = [[1, 1, 1, 1, 2, 2, 2, 2], [28, 29, 30, 31 , 1, 2, 3, 4]]

index = pd.MultiIndex.from_arrays(arrays, names=('Month', 'Day'))

df = pd.DataFrame(np.random.randn(8,2), index=index)

Урожайность:

   Month  Day         0         1
0      1   28 -0.295065 -0.843433
1      1   29  0.367759  0.837147
2      1   30  0.051956  0.430499
3      1   31  1.917990  1.066545
4      2    1  1.345338 -0.600304
5      2    2 -0.475890  0.763301
6      2    3  0.560985  1.747668
7      2    4  0.377741 -0.310094

Просто используйте reset_index(), объедините столбцы и конвертируйте в datetime:

new = df.reset_index()

new['Date'] = pd.to_datetime(new['Month'].astype(str) + '/' + new['Day'].astype(str), format='%m/%d')

Урожайность:

   Month  Day         0         1       Date
0      1   28 -0.295065 -0.843433 1900-01-28
1      1   29  0.367759  0.837147 1900-01-29
2      1   30  0.051956  0.430499 1900-01-30
3      1   31  1.917990  1.066545 1900-01-31
4      2    1  1.345338 -0.600304 1900-02-01
5      2    2 -0.475890  0.763301 1900-02-02
6      2    3  0.560985  1.747668 1900-02-03
7      2    4  0.377741 -0.310094 1900-02-04

Наконец, используйте столбцы set_index() и drop():

new = new.set_index('Date').drop(['Month','Day'], axis=1)

Урожайность:

                   0         1
Date                          
1900-01-28  0.503419 -1.197496
1900-01-29 -0.059114  0.552766
1900-01-30  0.365710 -0.079030
1900-01-31 -2.782296  1.027040
1900-02-01  1.343155 -0.846419
1900-02-02  1.334560  0.392820
1900-02-03  0.537082  1.486579
1900-02-04  0.506200  0.138864
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...