如何使用每小时值和日期时间索引将宽格式转换为长格式?

时间:2014-08-01 06:33:28

标签: python pandas pivot

我正在从长格式的固定SQL架构中检索数据,并希望将其转换为宽格式。

作为复杂功能,DataFrame中的每一行代表一天产品的值。值存储在表示一天中特定小时的列中。以下示例显示了六小时的间隔长度。这意味着我们每天在00:00,06:00,12:00和18:00存储四个值.DataFrame如下所示:

      id        date  0000  0600  1200  1800
 0  APPL  01.01.2014    12    15    17    19
 1  APPL  02.01.2014    21    23    25    27
 2  MSFT  01.01.2014     1     2     3     4
 3  MSFT  02.01.2014     5     6     7     8

我希望以宽格式实现的DataFrame是:

                     APPL  MSFT
2014-01-01 00:00:00    12     1
2014-01-01 06:00:00    15     2
2014-01-01 12:00:00    17     3
2014-01-01 18:00:00    19     4
2014-01-02 00:00:00    21     5
2014-01-02 06:00:00    23     6
2014-01-02 12:00:00    25     7
2014-01-02 18:00:00    27     8

我尝试过各种pivot,un / stack和set_index组合来实现目标结构,但失败了。我最接近的是使用:

df = src.set_index(['date','id']).stack()

返回:

date        id        
01.01.2014  APPL  0000    12
                  0600    15
                  1200    17
                  1800    19
02.01.2014  APPL  0000    21
                  0600    23
                  1200    25
                  1800    27
01.01.2014  MSFT  0000     1
                  0600     2
                  1200     3
                  1800     4
02.01.2014  MSFT  0000     5
                  0600     6
                  1200     7
                  1800     8

但是我知道我无法解决MultiIndex。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

import pandas as pd
import io

text = """      id        date  0000  0600  1200  1800
 0  APPL  01.01.2014    12    15    17    19
 1  APPL  02.01.2014    21    23    25    27
 2  MSFT  01.01.2014     1     2     3     4
 3  MSFT  02.01.2014     5     6     7     8"""

df = pd.read_csv(io.BytesIO(text), delim_whitespace=True)
df = df.set_index(["id", "date"]).stack().unstack(0)

def f(key):
    date, hour = key
    time = "{} {}:{}:00".format(date, hour[:2], hour[2:])
    return pd.to_datetime(time, dayfirst=True)

df.index = df.index.map(f)
print df

输出:

id                   APPL  MSFT
2014-01-01 00:00:00    12     1
2014-01-01 06:00:00    15     2
2014-01-01 12:00:00    17     3
2014-01-01 18:00:00    19     4
2014-01-02 00:00:00    21     5
2014-01-02 06:00:00    23     6
2014-01-02 12:00:00    25     7
2014-01-02 18:00:00    27     8