使用datetime索引将2D表(由pd.read_excel获取)更改为DataFrame

时间:2018-04-01 07:04:26

标签: pandas

如何将以下2D表格(由pd.read_excel获取)更改为带有日期时间索引的pandas DataFrame?换句话说,

来自(data_xlsx):获取者:data_xlsx = pd.read_excel('...')

enter image description here

收件人:

1948-01-01 3.4
1948-02-01 3.8
1948-03-01 4.0
。 。 。
1952-11-01 2.8
1952-12-01 2.7

1 个答案:

答案 0 :(得分:0)

您可以使用:

df = df.melt('Year', value_name='val')
df.index = pd.to_datetime(df['Year'].astype(str) + df['variable'], format='%Y%b')
df = df.sort_index()[['val']]

<强>解释

  1. 首先重塑melt
  2. 使用自定义格式按to_datetime创建DatetimeIndex,然后选中http://strftime.org/
  3. 上次sort_index并且仅选择val
  4. 替代解决方案:

    df = df.set_index('Year').stack()
    df.index = (pd.to_datetime(df.index.get_level_values(0).astype(str) + 
                              df.index.get_level_values(1), format='%Y%b'))
    df = df.to_frame('val')
    

    <强>解释

    1. set_index
    2. Year列创建索引
    3. stack重塑MultiIndex
    4. to_datetime创建DatetimeIndex,然后按get_level_values
    5. 选择级别
    6. 如有必要,请在Series.to_frame
    7. 之后创建一列DataFrame

      <强>示例

      np.random.seed(1213)
      
      c = ['Jan', 'Feb', 'Mar', 'Apr','May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
      df = pd.DataFrame(np.random.randint(10, size=(5,12)), columns=c)
      df.insert(0, 'Year', np.arange(1948, 1953))
      print (df)
         Year  Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
      0  1948    0    5    4    8    0    4    6    3    3    0    1    7
      1  1949    9    5    2    9    3    1    7    6    3    8    9    2
      2  1950    9    5    2    1    6    8    7    7    6    6    5    7
      3  1951    1    9    9    3    1    4    0    1    5    1    1    4
      4  1952    3    7    1    1    7    3    7    6    8    8    6    1
      
      df = df.set_index('Year').stack()
      df.index = (pd.to_datetime(df.index.get_level_values(0).astype(str) +
                                 df.index.get_level_values(1), format='%Y%b'))
      df = df.to_frame('val')
      print (df.head(10))
                  val
      1948-01-01    0
      1948-02-01    5
      1948-03-01    4
      1948-04-01    8
      1948-05-01    0
      1948-06-01    4
      1948-07-01    6
      1948-08-01    3
      1948-09-01    3
      1948-10-01    0