Изменение формата метки столбца с даты на дату - PullRequest
0 голосов
/ 30 августа 2018

Я пытался импортировать данные из файла Excel, где несколько меток столбцов являются датами. Заголовки файлов Excel выглядят примерно так:

Наименование 2018-08-01 2018-08-02 Сумма

После импорта в фрейм данных я получил метки столбцов-

Имя 2018-08-01 00:00:00 2018-08-02 00:00:00 Сумма

Итак, я хотел убрать часы из заголовков. Поскольку даты обновляются автоматически в файле Excel, поэтому я не могу заменить метки с помощью ' df ['2018-08-01 00:00:00'] `Я попытался переименовать столбцы, используя следующий код

df1.columns[3] =  pd.to_datetime(df1.columns[3], format='%Y-%m-%d')

Однако это приводит к следующей ошибке:

TypeError: Index does not support mutable operations.

Я также пытался

df1.rename(df1.columns[3][lambda t: t.strftime('%Y-%M-%d')])

Что дает следующую ошибку

TypeError: 'datetime.datetime' object is not subscriptable

Я очень новичок в Python и dataframe, и я все еще на начальном этапе. Как мне это сделать?


решаемые

Поскольку я уже знаю индекс столбца, я преобразовал их из datetime object в string а затем нарезал их. Я пробовал итерацию, но она не работала, так что это единственный способ, которым я мог это сделать.

Edate=str(df1.columns[1])
Edatep=slice(0,10,1)
Gdate=str(df1.columns[2])
Gdatep=slice(0,10,1)

df1.columns=['Name',Edate[Edatep],Gdate[Gdatep],'Amount']

1 Ответ

0 голосов
/ 30 августа 2018

Индексы в пандах неизменны - лучше всего создать новый индекс.

Я думаю, что здесь list comprehension хорошо работает с преобразованием только timestamps с if-else:

df1 = pd.DataFrame(columns=['Name', pd.Timestamp('2018-08-01'), 
                             pd.Timestamp('2018-08-02'), 'Amount'])
print (df1)
Empty DataFrame
Columns: [Name, 2018-08-01 00:00:00, 2018-08-02 00:00:00, Amount]
Index: []

print (df1.columns.map(type))
Index([                                     <class 'str'>,
       <class 'pandas._libs.tslibs.timestamps.Timestamp'>,
       <class 'pandas._libs.tslibs.timestamps.Timestamp'>,
                                            <class 'str'>],
      dtype='object')

df1.columns=[x.strftime('%Y-%M-%d') if isinstance(x,pd.Timestamp) else x for x in df1.columns]
print (df1)
Empty DataFrame
Columns: [Name, 2018-00-01, 2018-00-02, Amount]
Index: []

Другие решения, если входные данные являются строками:

df1.columns = df1.columns.astype(str)

df1.columns = df1.columns.astype(str).str.replace(' 00:00:00', '')
print (df1)
Empty DataFrame
Columns: [Name, 2018-08-01, 2018-08-02, Amount]
Index: []

cols = pd.to_datetime(df1.columns, errors='coerce')
df1.columns = df1.columns.where(cols.isnull(), cols.strftime('%Y-%M-%d'))

print (df1)

Empty DataFrame
Columns: [Name, 2018-00-01, 2018-00-02, Amount]
Index: []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...