【问题标题】:pandas multi-index of integers to datetime index?大熊猫整数到日期时间索引的多索引?
【发布时间】:2018-10-30 00:31:15
【问题描述】:

我有一个如下所示的数据框,其中包含多个整数索引,表示一年中的月份和日期,以及那些日子的最高和最低温度记录。

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

如何将此多索引转换为日期时间类型的单个索引?我正在寻找类似这种转换的东西:

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

【问题讨论】:

  • 你想要哪一年?
  • 我建议使用reset_index(),然后将结果列组合起来创建一个新列,转换为日期时间并设置为索引
  • @ALollz,这些是某些地区大约 10 年期间的最低和最高温度。所以没有与数据相关的一年。
  • datetime 至少需要定义年、月和日。如果你需要使用datetime,你可以选择一些虚拟年份,比如 1900

标签: python pandas


【解决方案1】:

以数据框的顶部为例:

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

在您的 MultiIndex 的各个级别上使用 pd.to_datetime,然后使用您想要的格式使用 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

【讨论】:

    【解决方案2】:

    让我们以这个示例数据框为例:

    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(),合并列并转换为日期时间:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 2013-07-20
      • 1970-01-01
      • 2017-05-22
      • 2016-06-03
      • 2023-01-13
      • 2023-01-12
      相关资源
      最近更新 更多