Сортировка столбца даты и времени, когда месяц отформатирован как имя - PullRequest
1 голос
/ 09 ноября 2019

У меня есть столбец Date Time в моем фрейме данных, в котором в качестве строки указаны дата и время.

Product       Date Time
ABC          Wed Jan 2 11:14:24 2019
ABC123       Wed Jan 2 11:14:24 2019
ABCXZY       Wed Jan 2 11:14:24 2019
BVF123       Mon Jan 14 10:24:20 2019
ABC456       Mon Jan 14 10:24:20 2019
ABC000       Mon Feb 4 10:44:08 2019
ABCXYZ       Mon Feb 4 10:44:08 2019
ABC678       Mon Feb 4 10:44:08 2019
ABCQYZ       Wed Feb 20 09:14:40 2019
ABC090       Wed Feb 20 09:14:40 2019  

Я преобразовал этот столбец в формат даты и времени, используя -

df['Date'] = pd.to_datetime(df['Date Time']).dt.strtime('%d-%b-%Y')

Теперь я хочу отсортировать этот кадр данных на основе столбца Date, чтобы отобразить количества длякаждая дата в порядке возрастания даты, но когда я использую -

df.sort_values(by='Date', inplace=True, ascending=True)

, она сортируется только по дате и игнорирует название месяца, то есть как

02-Jan-2019
04-Feb-2019
08-Mar-2019
13-Feb-2019
14-Jan-2019
20-Feb-2019
21-Mar-2019

вместо

02-Jan-2019
14-Jan-2019
04-Feb-2019
13-Feb-2019
20-Feb-2019
08-Mar-2019
21-Mar-2019

Как я могу получить нужную сортировку, используя pandas datetime или любой другой модуль?

Ответы [ 2 ]

1 голос
/ 09 ноября 2019
pd.to_datetime(df['Date Time']).dt.strtime('%d-%b-%Y')

возвращает последовательность строк (точнее, «тип объекта»), но не серию datetime. Вот почему ваша сортировка не так. Вот код для этого:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

### Dataframe    
data = {'Product' : ['ABC', 'ABC123', 'ABCXZY', 'BVF123', 'ABC456', 'ABC000', 'ABCXYZ', 'ABC678', 'ABCQYZ', 'ABC090'], 'Date Time' : ['Wed Jan 2 11:14:24 2019', 'Wed Jan 2 11:14:24 2019', 'Wed Jan 2 11:14:24 2019', 'Mon Jan 14 10:24:20 2019', 'Mon Jan 14 10:24:20 2019', 'Mon Feb 4 10:44:08 2019', 'Mon Feb 4 10:44:08 2019', 'Mon Feb 4 10:44:08 2019', 'Wed Feb 20 09:14:40 2019', 'Wed Feb 20 09:14:40 2019']}

df = pd.DataFrame(data)

### Conversion to datetime    
df['Date'] = pd.to_datetime(df.loc[:, 'Date Time'])

### Sorting
df.sort_values(by = 'Date', inplace = True)

### Plot    
ax = df.groupby('Date').count().Product.plot()
ax.xaxis.set_major_formatter(mdates.DateFormatter('%d-%b-%Y')) # Formatting x labels
1 голос
/ 09 ноября 2019

Мы можем сделать argsort

df=df.iloc[pd.to_datetime(df['Date Time'],format='%d-%b-%Y').argsort()]
Out[20]: 
     Date Time
3  14-Jan-2019
0  04-Feb-2019
2  13-Feb-2019
4  20-Feb-2019
1  08-Mar-2019
5  21-Mar-2019

Обновление

s=df.groupby(['Date Time']).size()
s.index=pd.to_datetime(s.index,format='%d-%b-%Y')
s.sort_index(inplace=True)
s.index=s.index.strftime('%d-%b-%Y')
...