将月份格式化为名称时对日期时间列进行排序
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
我的数据框中有一列 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