Преобразование кадра данных на основе его индекса даты и времени - PullRequest
0 голосов
/ 06 октября 2018

У меня есть следующий фрейм данных:

date  = ['2014-02-03 23:00:00','2015-02-03 23:30:00','2015-02-04 00:00:00','2016-02-04 01:30:00'] 
value = [33.24  , 31.71  , 34.39  , 34.49  ]
df = pd.DataFrame({'value':value,'index':date})
df.index = pd.to_datetime(df['index'],format='%Y-%m-%d %H:%M')
df.drop(['index'],axis=1,inplace=True)
print(df.head())

                     value
index                     
2014-02-03 23:00:00  33.24
2015-02-03 23:30:00  31.71
2015-02-04 00:00:00  34.39
2016-02-04 01:30:00  34.49

Я хотел бы эффективно "развернуть" фрейм данных, поэтому должен иметь следующий результат:

                      2014   2015  2016
index                     
2014-02-03 23:00:00  33.24
2015-02-03 23:30:00         31.71
2015-02-04 00:00:00         34.39
2016-02-04 01:30:00                34.49

или даже лучше 'сворачивается«предыдущий:

               2014   2015  2016
index                     
0             33.24  31.71  34.39
1                    34.39

Я в основном хочу создать столбец в год.Есть идеи, как это сделать эффективно?

Большое спасибо,

1 Ответ

0 голосов
/ 06 октября 2018

Вы можете сделать:

pd.pivot(df.index,df.index.year, df.value)

index                 2014   2015   2016
index                                   
2014-02-03 23:00:00  33.24    NaN    NaN
2015-02-03 23:30:00    NaN  31.71    NaN
2015-02-04 00:00:00    NaN  34.39    NaN
2016-02-04 01:30:00    NaN    NaN  34.49

# If you want blank strings instead of `NaN`:
# pd.pivot(df.index,df.index.year, df.value).fillna('')

# index                 2014   2015   2016
# index                                   
# 2014-02-03 23:00:00  33.24              
# 2015-02-03 23:30:00         31.71       
# 2015-02-04 00:00:00         34.39       
# 2016-02-04 01:30:00                34.49

Что касается ваших правок, чтобы «свернуть» это, вы можете использовать np.sort и создать новый фрейм данных, если порядок не имеет значения.Не уверен, что это будет самый эффективный способ сделать это.

pd.DataFrame(np.sort(pd.pivot(df.index,df.index.year, df.value),0)).dropna(how='all')

       0      1      2
0  33.24  31.71  34.49
1    NaN  34.39    NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...