2015-10-31 3 views
1

В Pandas у меня есть столбец с датами формата:% Y /% m /% d (например, 2015/10/31). Я хочу изменить этот формат на другой, например:% d-% m-% y (например, 31-10-15).Применение формата datetime в pandas для сортировки

Включение колонки в правильный объект для последующего сортировки:

df['Date'] = pd.to_datetime(df['Date']) 

Применив strptime:

df['Date'] = df['Date'].apply(lambda x: 
    datetime.strptime(x,'%d-%m-%y')) 

TypeError: must be str, not Timestamp 

Кроме того, странно, если даты ввода панд dataframe ничем, кроме стандарта ISO по умолчанию то при сортировке возникают странные результаты. Такие, как несовместимые форматы и/или не правильно сортировочные:

0 2015-01-31 
1 2016-15-01 

ответ

0

Решение одной части вопроса:

Я хочу изменить этот формат в другой, как:% d-% m- % y (например, 31-10-15).

... Если даты вводят в dataframe pandas ничем, кроме стандартного стандарта ISO, тогда при сортировке возникают странные результаты. Такие как несогласованные форматы и/или неправильная сортировка

на самом деле действительно прост. Панды были проблемы, потому что он считает, что формат дд-мм-гггг международным и дополнительный dayfirst аргумент должен быть введен для того, чтобы лечиться правильно:

df['Date'] = pd.to_datetime(df['Date'], dayfirst = [True])

Может также это нужно (в настоящее время работает для анализа данных, но не отображается):

pd.set_option('display.date_dayfirst', True)

2

Потому что вы имеете дело с датой и время объектом уже, вы получаете эту ошибку, потому что strptime требует строки и не Timestamp объекта. Из определения strptime:

def strptime(cls, date_string, format): 
     'string, format -> new datetime parsed from a string (like time.strptime()).' 

То, что вы на самом деле хотите сделать это первым преобразовать DateTime в формате вам требуется, чтобы строки с помощью strftime:

def strftime(self, format): 
     """Return a string representing the date and time, controlled by an 
     explicit format string. 

, а затем вернуть его обратно в a datetime объект с использованием strptime. Следующая демонстрация продемонстрирует. Обратите внимание на использование .date() в конце, чтобы удалить ненужную часть времени 00:00:00.

>>> from datetime import datetime 
>>> orig_datetime_obj = datetime.strptime("2015/10/31", '%Y/%m/%d').date() 
>>> print(orig_datetime_obj) 
2015-10-31 
>>> print(type(orig_datetime_obj)) 
<type 'datetime.datetime'> 
>>> new_datetime_obj = datetime.strptime(orig_datetime_obj.strftime('%d-%m-%y'), '%d-%m-%y').date() 
>>> print(new_datetime_obj) 
2015-10-31 
>>> print(type(new_datetime_obj)) 
<type 'datetime.date'> 

В качестве альтернативы, если все, что вам требуется только преобразовать его в другой формат, но в строке, вы можете просто придерживаться только с помощью strftime с новым форматом. Используя мой пример выше, вам нужно будет только эту часть:

orig_datetime_obj.strftime('%d-%m-%y') 
+0

@Prof Я заметил, что вы удалили принятый ответ. Есть ли особая проблема? Или был ли более простой способ решить это в пандах? Я спрашиваю из любопытства :) – idjaw

+0

Или я сумасшедший, и там никогда не было принятого ответа .... :) – idjaw

+0

Я не принял ответа только сейчас, потому что понял, что я не понял свой вопрос.Мой код состоит из строки с '.strptime', примененной к ней, а затем' .strftime' используется для изменения ее в правильном формате. Тем не менее, Pandas не сортирует столбцы относительно даты должным образом, поэтому я должен использовать формат, который сортируется правильно выше. Этот формат равен «% Y /% m /% d''. Используя этот формат, Pandas правильно сортирует столбцы. Но я бы хотел, чтобы он сортировался, а затем возвращал значения в желаемый формат: ''% d-% m-% y''. – Prof

Смежные вопросы