2013-12-02 4 views
2

У меня есть .csv данные, которые я хочу отсортировать по столбцу даты. Мой формат даты имеет следующий вид:Сортировка по дате в pandas - Python 2.7

Неделя, квартал, год: Так WK01Q12001 например.

Когда я .sort() мой dataframe на этой колонке, результирующая сортируется как:

WK01Q12001, WK01Q12002, WK01Q12003, WK01Q22001, WK01Q22002, WK01Q22003, ... WK02Q12001, WK02Q12002... 

, например. Это имеет смысл, потому что он сортирует строку в порядке возрастания.

Но мне нужно мои данные сортируются в хронологическом порядке, так что результат, как следующее:

WK01Q12001, WK02Q12001, WK03Q12001, WK04Q12001, ... , WK01Q22001, WK02Q22001, ... WK01Q12002, WK02Q22002 ... 

Как я могу сортировать это таким образом, используя панда? Возможно, сортировка строки в обратном порядке? (справа налево) или создания какого-либо объекта datetime?

Я также попытался с помощью Series(): pd.Series([pd.to_datetime(d) for d in weeklyData['Date']]) Но результат такой же, как выше .sort() метода.

ОБНОВЛЕНИЕ: My DataFrame похож на формат листа excel и в настоящее время выглядит следующим образом. Я хочу сортировать хронологически по «Дате».

Date   Price  Volume 
WK01Q12001 32  500 
WK01Q12002 43  400 
WK01Q12003 55  300 
WK01Q12004 58  350 
WK01Q22001 33  480 
WK01Q22002 40  450 
. 
. 
. 
WK13Q42004 60  400 

ответ

2

Вы можете добавить новый столбец в свой фреймворк, содержащий компоненты даты в качестве списка.

например.

a = ["2001", "Q2", "WK01"] 
b = ["2002", "Q2", "WK01"] 
c = ["2002", "Q2", "WK02"] 

Таким образом, вы можете применить функцию к раме данных, чтобы сделать это ...

def tolist(x): 
    g = re.match(r"(WK\d{2})(Q\d)(\d{4})", str(x)) 
    return [g.group(3), g.group(2), g.group(1)] 

затем ...

df['datelist'] = df['Date'].apply(tolist) 

, который дает вам дату в виде списка расположенных в порядке важности ...

  Date Price Volume   datelist 
0 WK01Q12001  32  500 [2001, Q1, WK01] 
1 WK01Q12002  22  400 [2002, Q1, WK01] 
2 WK01Q12003  42  500 [2003, Q1, WK01] 

При сравнении списков одинаковой длины в Python операторы сравнения ведут себя хорошо. Таким образом, вы можете использовать стандартную сортировку DataFrame для заказа своих данных.

Так по умолчанию сортировка в серии панды будет работать правильно, когда вы делаете ...

df.sort('datelist') 
+0

Я не был уверен, что это будет работать с серией Pandas, но я просто попытался сделать серию со списками, разбитыми таким образом, и это сработало просто отлично. –

+0

Что такое 'date'? это мой объект DataFrame? Пожалуйста, см. Выше ОБНОВЛЕНИЕ по моему вопросу.Я получаю ошибку типа при попытке этого: «TypeError: ожидаемая строка или буфер» Спасибо! – brno792

+0

Аналогично, когда я пытаюсь использовать 're.match (r" (WK \ d {2}) (Q \ d) (\ d {4}) ", dataframeobj ['date'])', я получаю размер буфера ошибка несоответствия. – brno792

1

Использование str.replace изменить порядок ключей первого:

s = "WK01Q12001, WK01Q12002, WK01Q12003, WK01Q22001, WK01Q22002, WK01Q22003, WK02Q12001, WK02Q12002" 
date = map(str.strip, s.split(",")) 
df = pd.DataFrame({"date":date, "value":range(len(date))}) 
df["date2"] = df.date.str.replace(r"WK(\d\d)Q(\d)(\d{4})", r"\3Q\2WK\1") 
df.sort("date2") 
+0

Столбец даты - это всего лишь один столбец в моей pandas dataframe. Его как лист excel, где я хочу сортировать по дате, но дата находится в неправильном формате. Будет ли ваш метод работать для сортировки всего фрейма даты? Также у меня есть 13WKs за квартал, 4 квартала в год и несколько лет. Это несколько сотен «дат». Есть лучший способ сделать это? Благодаря! – brno792

1

Я также был в состоянии для того, чтобы выполнить эту переформатировку даты очень легко, используя SQL. Когда я впервые запросил свои данные, я сделал SELECT *, RIGHT([Date], 4) + SUBSTRING([Date], 5, 2) + LEFT([Date], 4) As 'SortedDate' FROM [Table] ORDER BY 'SortedDate' ASC.

Используйте подходящий инструмент для работы!

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