Объединение столбцов «год» и «месяц» для формирования индекса для данных временных рядов

#python #time-series

#python #временные ряды

Вопрос:

У меня есть набор данных об осадках следующего формата.

ГОД ЯНВАРЬ ФЕВРАЛЬ МАРТ АПРЕЛЬ МАЙ ИЮНЬ ИЮЛЬ АВГУСТ СЕНТЯБРЬ ОКТЯБРЬ НОЯБРЬ ДЕКАБРЬ
1901 2.7 0.4 4.7 10.0 13.0 16.9 19.2 18.3 15.7 10.6 4.9 3.5
1902 4.1 3.2 7.5 10.3 10.0 15.1 18.2 17.4 15.0 10.2 6.3 3.5
1903 3.8 5.9 7.6 7.1 12.9 14.9 17.6 17.3 15.5 12.1 6.9 2.7
1904 3.0 4.6 5.5 10.3 13.6 16.3 20.2 18.5 13.9 11.2 5.4 4.8
1905 1.7 4.0 7.4 9.3 11.9 16.5 20.0 17.6 14.7 8.4 5.5 3.8

Мне нужно, чтобы он был в следующем формате, чтобы выполнять прогнозирование временных рядов в python.

ДАТА ВЫПАДЕНИЯ ОСАДКОВ
1901-01-01 2.7

1901-02-01 0.4

1901-03-01 4.7

1901-04-01 10.0

Столбец «ДАТА» должен иметь тип данных datetime, а столбец «КОЛИЧЕСТВО ОСАДКОВ» должен содержать значение количества осадков за определенный месяц года.

Пожалуйста, помогите мне с выполнением этого преобразования.

Комментарии:

1. Это довольно просто для кодирования; с каким аспектом этого у вас возникли проблемы?

Ответ №1:

Я предполагаю, что ваш фрейм данных уже создан, поэтому в приведенном ниже описании этот шаг (и импорт) опущен.

Начните с определения функции, которая будет применена позже, для создания DATE столбца из YEAR и MONTH столбцов:

 def cnv(row):
    datStr = '01 '   row.MONTH   ' '   str(row.YEAR)
    return pd.to_datetime(datStr, format='%d %b %Y').date()
  

Затем действуйте следующим образом:

  1. Создайте второй фрейм данных с YEAR названием месяца в качестве MultiIndex:

     df2 = df.set_index('YEAR').stack().to_frame(name='RAINFALL')
      
  2. Преобразуйте мультииндекс в обычные столбцы, переименовав (безымянный в оригинале
    Многоиндексный) level_1 к MONTH :

     df2 = df2.reset_index().rename(columns={'level_1': 'MONTH'})
      
  3. Создайте DATE столбец, применив созданную выше функцию:

     df2['DATE'] = df2.apply(cnv, axis=1)
      
  4. И, наконец, удалите столбцы YEAR и MONTH и измените порядок столбцов:

     df2 = df2.drop(['YEAR', 'MONTH'], axis=1).sort_index(axis=1)
      

Два первых шага могут быть объединены в одну инструкцию, но я намеренно
написал их отдельно, чтобы упростить тестовую распечатку промежуточных результатов.