Сортировка индекса столбца фрейма данных Pandas по дате

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я хочу отсортировать фрейм данных по индексу столбца. Проблема в том, что мои столбцы — это ‘даты’, дд / мм / гггг, импортированные непосредственно из моего Excel. Например:

     10/08/20  12/08/20 11/08/20
0   2.0        6.0       15.0
1   6.0        11.0      8.0
2   4.0        7.0       3.0
3   7.0        12.0      2.0
4   12.0       5.0       7.0
  

Результат, который я хочу, это:

     10/08/20  11/08/20 12/08/20
0   2.0        15.0      6.0
1   6.0        8.0       11.0
2   4.0        3.0       7.0
3   7.0        2.0       12.0
4   12.0       7.0       5.0
  

Я использую

 df.sort_index(axis=1)
  

Это выдает мне следующую ошибку:

Ошибка типа: ‘<‘ не поддерживается между экземплярами ‘datetime.datetime’ и ‘str’

Я хочу сделать это в фрейме данных panda. Любая помощь будет оценена. Спасибо

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

1. Почему у двух дат в конце есть '.' , а у одной нет?

2. Пожалуйста, игнорируйте «. » это было по ошибке. Действительно сожалею об этой путанице

3. @anmol sureka , пожалуйста, попробуйте отредактированный код. Поскольку столбцы не были в формате datetime, как вы отредактировали в своем вопросе.

Ответ №1:

Сначала удалите ‘.’ в конце даты из таблицы источника данных. для этих данных

     10-08-2020  12-08-2020  11-08-2020
0   2           6           15
1   6           11          8
2   4           7           3
3   7           12          2
4   12          5           7
  

попробуйте это

 import datetime as dt
df.columns=pd.Series(df.columns).apply(lambda d: dt.datetime(d, dt.datetime.strptime(d, '%d/%m/%Y')))
df.sort_index(axis = 1)
  

Ответ №2:

Первый:

 df.columns = df.columns.str.replace(".", "")
  

Затем:

 df.sort_index(axis = 1)
  

Обновление: как упоминал Ch3steR в комментариях. Для удаления «.»

 df.columns = df.columns.str.rstrip(".")
  

Использование str.rstrip для обобщения, поскольку day.month.year это допустимый формат, использование str.replace заменило бы каждый .

Пример:

 s = pd.Series(["1.2.2020."])
pd.to_datetime(s.str.replace('.', ''))
# 0   2020-12-20         # Interpeted wrong
# dtype: datetime64[ns]

pd.to_datetime(s.str.rstrip('.'))
# 0   2020-01-02
# dtype: datetime64[ns]
  

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

1. @Ch3steR КРУТО! Не знал об этой функции. Обновил ответ вашим предложением.

2. Добавлены некоторые детали, не стесняйтесь отменить изменения, если не в порядке.

Ответ №3:

Ваша ошибка связана с тем, что вы смешиваете строковые типы с типами даты. Либо все ваши имена столбцов являются строками, либо все они являются датами, но вы не можете смешивать оба.

Например

 l=[[2.0, 6.0, 15.0],
   [6.0, 11.0, 8.0],
   [4.0, 7.0, 3.0],
   [7.0, 12.0, 2.0],
   [12.0, 5.0, 7.0]]

d = pd.DataFrame(l, columns =['10/08/20',  '12/08/20', '11/08/20']) # column names are strings
  

выдает

    10/08/20  12/08/20  11/08/20
0       2.0       6.0      15.0
1       6.0      11.0       8.0
2       4.0       7.0       3.0
3       7.0      12.0       2.0
4      12.0       5.0       7.0
  

Теперь, если я хочу выполнить сортировку по именам столбцов, я набираю

 d.sort_index(axis = 1)

   10/08/20  11/08/20  12/08/20
0       2.0      15.0       6.0
1       6.0       8.0      11.0
2       4.0       3.0       7.0
3       7.0       2.0      12.0
4      12.0       7.0       5.0
  

Если бы, с другой стороны, имена столбцов были датами, как в

 from dateutil.parser import parse
d = pd.DataFrame(l, columns =[parse('10/08/20'),  parse('12/08/20'), parse('11/08/20')])
  

у нас будет

    2020-10-08  2020-12-08  2020-11-08   #now column names are dates
0         2.0         6.0        15.0
1         6.0        11.0         8.0
2         4.0         7.0         3.0
3         7.0        12.0         2.0
4        12.0         5.0         7.0
  

Опять же, вы можете отсортировать их, используя тот же

 details.sort_index(axis = 1)
  
   2020-10-08  2020-11-08  2020-12-08
0         2.0        15.0         6.0
1         6.0         8.0        11.0
2         4.0         3.0         7.0
3         7.0         2.0        12.0
4        12.0         7.0         5.0
  

и не выдаст вам ошибки.

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

1. Привет. Спасибо за ответ. ‘.’ отсутствует в исходном листе. Он попал сюда по ошибке. Извините за это. Когда я импортирую Excel, мои даты импортируются в формате datetime.datetime, из-за чего он выдает ошибку: TypeError: ‘<‘ не поддерживается между экземплярами ‘datetime.datetime’ и ‘str’