[英]How to convert a dataframe from long to wide, with values grouped by year in the index?
[英]How to convert wide to long format with hourly values and datetime index?
我正在從固定的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
我嘗試了樞軸,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。
非常感謝您的幫助。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.