将月份格式化为名称时对日期时间列进行排序

Sorting datetime column when month is formatted as name

我的数据框中有一列 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 或任何其他模块获得所需的排序?

我们可以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')
pd.to_datetime(df['Date Time']).dt.strtime('%d-%b-%Y')

returns 一系列字符串(准确地说是 "object type"),但不是一系列日期时间。这就是为什么你的排序是错误的。 这是执行此操作的代码:

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