【问题标题】:Set two levels of indexes (indices?) as datetime.date() and datetime.time() using a column of datetime objects使用一列 datetime 对象将两个级别的索引(索引?)设置为 datetime.date() 和 datetime.time()
【发布时间】:2018-08-03 14:08:12
【问题描述】:

我有一个 DataFrame,它有一列“时间戳”,其中包含 datetime 对象 (YYYY-mm-dd HH:MM:SS)。我想从这些时间戳中提取日期(datetime.date())并将其设置为 0 级索引,并将时间(datetime.time())设置为 1 级索引。

例子:

                   timestamp    value1    value2
index    
    0    2018-01-01 09:00:00        10        20
    1    2018-01-01 09:01:00        11        21
    2    2018-01-02 09:00:00        12        22
    3    2018-01-02 09:01:00        13        23

会变成:

                          value1    value2
date          time
2018-01-01    09:00:00        10        20
              09:01:00        11        21
2018-01-02    09:00:00        12        22
              09:01:00        13        23

【问题讨论】:

    标签: python pandas datetime indexing


    【解决方案1】:

    选项 1
    使用dropset_index

    df.set_index([df.timestamp.dt.date, df.timestamp.dt.time]).drop('timestamp', 1)
    
                          value1  value2
    timestamp  timestamp                
    2018-01-01 09:00:00       10      20
               09:01:00       11      21
    2018-01-02 09:00:00       12      22
               09:01:00       13      23
    

    选项 2

    d = df.set_index('timestamp')
    d.index = [d.index.date, d.index.time]
    d
    
                         value1  value2
    2018-01-01 09:00:00      10      20
               09:01:00      11      21
    2018-01-02 09:00:00      12      22
               09:01:00      13      23
    

    【讨论】:

      【解决方案2】:

      使用set_indexMultiIndex.from_arrays 和最后一个drop 原始列:

      mux = pd.MultiIndex.from_arrays([df['timestamp'].dt.date, df['timestamp'].dt.time], 
                                       names=('date','time'))
      df = df.set_index(mux).drop('timestamp', 1)
      

      或添加rename_axis:

      df = (df.set_index([df['timestamp'].dt.date, df['timestamp'].dt.time])
              .drop('timestamp', 1)
              .rename_axis(('date','time')))
      
      print (df)
                           value1  value2
      date       time                    
      2018-01-01 09:00:00      10      20
                 09:01:00      11      21
      2018-01-02 09:00:00      12      22
                 09:01:00      13      23
      

      【讨论】:

        猜你喜欢
        • 2019-10-29
        • 2021-09-09
        • 2019-11-09
        • 1970-01-01
        • 2021-07-05
        • 1970-01-01
        • 2017-02-23
        • 2011-01-21
        • 2019-03-03
        相关资源
        最近更新 更多