У меня есть dataframe с изменяющимися именами столбцов. Имена столбцов существуют из «строк» и «даты», как это:

print(df.columns)
Index([              'Key',    'COUNTRY',            'MARKET',
                 'A1',               'CAB',           'type',
   2021-06-01 00:00:00, 2021-07-01 00:00:00, 2021-08-01 00:00:00,
   2021-09-01 00:00:00, 2021-10-01 00:00:00, 2021-11-01 00:00:00,
   2021-12-01 00:00:00],
  dtype='object')

Колонны «Дата» меняются: это может быть так, что - в следующей перезагрузке - есть еще один столбец, содержащий новую дату (формат должен быть такой же, как это: 2021-12-01 00:00:00) Отказ

Мой вопрос : Я хотел бы - автоматически - изменить имена столбцов на:

print(df.columns)
Index([              'Key',    'COUNTRY',            'MARKET',
                 'A1',               'CAB',           'type',
   2021_June_01, 2021_July_01, 2021_August_01,
   2021_September_01, 2021_October_01, 2021_November_01,
   2021_December_01],
  dtype='object')

Я не мог найти четкий способ сделать это. Единственное решение, которое я нашел, не был довольно и не стоил мне что-то вроде 15 строк кода (измените заголовки столбцов в индекс, используя функцию DT в абстрактные месяцы, сохраняйте «не даты» столбцы, как они, сочетают в себе все вместе).

Надеюсь, кто-то имеет лучший подход к этому. Спасибо заранее!

0
R overflow 7 Июн 2021 в 11:27

2 ответа

Лучший ответ

Чистый способ сделать это было бы проверить тип данных элемента и формата DataType столбцов в нужной строке, если она является временем.

Пример:

import pandas as pd

# simplified example for dataframe columns
cols = [              'Key',    'COUNTRY',            'MARKET',
                 'A1',               'CAB',           'type',
   pd.Timestamp("2021-06-01 00:00:00"), pd.Timestamp("2021-07-01 00:00:00")]


cols_new = [k.strftime("%Y_%B_%d") if isinstance(k, pd.Timestamp) else k for k in cols]

print(cols_new)
# ['Key', 'COUNTRY', 'MARKET', 'A1', 'CAB', 'type', '2021_June_01', '2021_July_01']

# update in one line:
# df.columns = [k.strftime("%Y_%B_%d") if isinstance(k, pd.Timestamp) else k for k in df.columns]
2
MrFuppes 7 Июн 2021 в 08:38

Попробуйте следующее:

from datetime import datetime
new_columns = []
for col in df.columns:
   try:
      new_columns.append(datetime.strptime(col, "%Y-%m-%d %H:%M:%S").strftime("%Y_%B_%d"))
   except:
      new_columns.append(col)
df.columns = new_columns
1
AmineBTG 7 Июн 2021 в 08:34