Pandas Pivot с указателем даты и времени - PullRequest
0 голосов
/ 13 июня 2018

У меня проблемы с поворотом информационного кадра со значением даты и времени в качестве индекса.Мой df выглядит так:

<code>Timestamp           Value
2016-01-01 00:00:00 16.546900
2016-01-01 01:00:00 16.402375
2016-01-01 02:00:00 16.324250

Где указана временная метка, datetime64 [нс].Я пытаюсь повернуть стол так, чтобы он выглядел следующим образом.

<code>
Hour       0    1    2    4   ....
Date
2016-01-01 16.5 16.4 16.3 17  ....
....
....

Я пытался использовать приведенный ниже код, но получаю сообщение об ошибке при запуске.

<code>df3 =  pd.pivot_table(df2,index=np.unique(df2.index.date),columns=np.unique(df2.index.hour),values=df2.Temp)

<code>KeyError                                  Traceback (most recent call last)
 in ()
      1 # Pivot Table
----> 2 df3 = pd.pivot_table(df2,index=np.unique(df2.index.date),columns=np.unique(df2.index.hour),values=df2.Temp)</p>

<p>~\Anaconda3\lib\site-packages\pandas\core\reshape\pivot.py in pivot_table(data, values, index, columns, aggfunc, fill_value, margins, dropna, margins_name)
     56         for i in values:
     57             if i not in data:
---> 58                 raise KeyError(i)
     59 
     60         to_filter = []</p>

<p>KeyError: 16.5469

Любая помощь или идеи будут с благодарностью.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Другой способ сделать это без lambda - создать индексы из DateTimeIndex.

df2 = pd.pivot_table(df, index=df.index.date, columns=df.index.hour, values="Value")
0 голосов
/ 13 июня 2018

Я немного расширил входные данные, как показано ниже (при условии, что в одной и той же дате / часе нет дублированных записей)

Timestamp           Value
2016-01-01 00:00:00 16.546900
2016-01-01 01:00:00 16.402375
2016-01-01 02:00:00 16.324250
2016-01-01 04:00:00 16.023928
2016-01-03 04:00:00 16.101919
2016-01-05 23:00:00 13.405928

Это выглядит немного неловко, но работает что-то вроде ниже.

df2['Date'] = df2.Timestamp.apply(lambda x: str(x).split(" ")[0])
df2['Hour'] = df2.Timestamp.apply(lambda x: str(x).split(" ")[1].split(":")[0])
df3 = pd.pivot_table(df2, values='Value', index='Date', columns='Hour')

[Вывод]

Hour        00      01        02        04          23
Date                    
2016-01-01  16.5469 16.402375 16.32425  16.023928   NaN
2016-01-03  NaN     NaN       NaN       16.101919   NaN
2016-01-05  NaN     NaN       NaN       NaN         13.405928

Наконец, если ваши столбцы должны быть целыми,

df3.columns = [int(x) for x in df3.columns]

Надеюсь, это поможет.

...