如何在 Python 中按工作日、月份等 sort/group 一系列 pandas 时间码?
How do I sort/group a pandas series of timecode by weekday, month, etc in Python?
我从 Python 3.7 中的数据框中提取了一个 pandas 系列。它包含一系列时间码,例如:
17833 Sat, 27 Nov 2010 06:00:00 -0000
851 Fri, 04 Dec 2009 06:07:00 -0000
4806 Fri, 23 Mar 2012 06:02:15 -0000
16341 Sat, 20 Aug 2011 11:48:18 -0000
9444 Mon, 16 May 2011 08:06:53 -0000
...
3262 Fri, 16 Dec 2011 07:30:00 -0000
37554 Wed, 11 Apr 2012 02:20:34 -0000
37555 Wed, 11 Apr 2012 02:34:00 -0000
28471 Thu, 18 Feb 2010 04:46:00 -0000
30324 Thu, 28 Jun 2012 21:23:40 -0000
左边的数字是原条目的索引。我希望能够将这个系列分类为各种不同的时间格式,例如按工作日分组(全部分组 "Sat"、全部分组 "Wed" 等)或按月分组("Nov","May").使用此时间码信息(所有条目在 02 小时、06 小时等)按 24 小时制时钟排序甚至会很棒。
目标输出将是(只是对这个样本进行排序):
按月
28471 Feb
4806 Mar
37554 Apr
37555 Apr
9444 May
...
30324 Jun
16341 Aug
17833 Nov
851 Dec
3262 Dec
按工作日
9444 Mon
37554 Wed
37555 Wed
28471 Thu
30324 Thu
...
4806 Fri
851 Fri
3262 Fri
16341 Sat
17833 Sat
按时间
37554 02
37555 02
28471 04
17833 06
4806 06
...
851 06
3262 07
9444 08
16341 11
30324 21
我已经尝试过使用 pd.to_datetime() 函数,但我不确定要为该函数提供什么格式以便它可以理解该系列,此处的说明可能会有所帮助。
对于格式化,您可以使用 pandas.to_datetime() 方法或使用 apply() 方法将 strftime/strptime 应用于系列。稍后您可以对序列或数据框使用 sort_values() 方法以获得预期输出。
参考this documentation for to_datetime() and for formatting refer to this页。
要按星期几排序,我们可以将您的日期转换为实际的日期时间格式 (datetime64
)。然后我们从日期时间中提取 dayofweek
并按该数字对其进行排序:
s = pd.to_datetime(df['Col1'].str.rsplit(n=2).str[0], format='%a, %d %b %Y').dt.dayofweek
df.assign(dayofweek=s).sort_values('dayofweek').drop(columns=['dayofweek'])
输出
Col1
4 Mon, 16 May 2011 08:06:53 -0000
6 Wed, 11 Apr 2012 02:20:34 -0000
7 Wed, 11 Apr 2012 02:34:00 -0000
8 Thu, 18 Feb 2010 04:46:00 -0000
9 Thu, 28 Jun 2012 21:23:40 -0000
1 Fri, 04 Dec 2009 06:07:00 -0000
2 Fri, 23 Mar 2012 06:02:15 -0000
5 Fri, 16 Dec 2011 07:30:00 -0000
0 Sat, 27 Nov 2010 06:00:00 -0000
3 Sat, 20 Aug 2011 11:48:18 -0000
dt.dayofweek
returns 星期几表示为 integer
:
的系列
pd.to_datetime(df['Col1'].str.rsplit(n=2).str[0], format='%a, %d %b %Y').dt.dayofweek
0 5
1 4
2 4
3 5
4 0
5 4
6 2
7 2
8 3
9 3
Name: Col1, dtype: int64
您可以对 month
执行相同的操作:
s2 = pd.to_datetime(df['Col1'].str.rsplit(n=2).str[0], format='%a, %d %b %Y').dt.month
df.assign(month=s2).sort_values('month').drop(columns=['month'])
Col1
8 Thu, 18 Feb 2010 04:46:00 -0000
2 Fri, 23 Mar 2012 06:02:15 -0000
6 Wed, 11 Apr 2012 02:20:34 -0000
7 Wed, 11 Apr 2012 02:34:00 -0000
4 Mon, 16 May 2011 08:06:53 -0000
9 Thu, 28 Jun 2012 21:23:40 -0000
3 Sat, 20 Aug 2011 11:48:18 -0000
0 Sat, 27 Nov 2010 06:00:00 -0000
1 Fri, 04 Dec 2009 06:07:00 -0000
5 Fri, 16 Dec 2011 07:30:00 -0000
如果您想要与发布的输出完全一样,您可以这样做,将列名称考虑为 'funded date'
:
月份:
s_month=pd.to_datetime(df['funded date']).dt.month_name().str[:3]
s_month.reindex(pd.to_datetime(df['funded date']).dt.month.sort_values().index)
28471 Feb
4806 Mar
37554 Apr
37555 Apr
9444 May
30324 Jun
16341 Aug
17833 Nov
851 Dec
3262 Dec
当天:
s_day=pd.to_datetime(df['funded date']).dt.day_name().str[:3]
s_day.reindex(pd.to_datetime(df['funded date']).dt.dayofweek.sort_values().index)
9444 Mon
37554 Wed
37555 Wed
28471 Thu
30324 Thu
851 Fri
4806 Fri
3262 Fri
17833 Sat
16341 Sat
我从 Python 3.7 中的数据框中提取了一个 pandas 系列。它包含一系列时间码,例如:
17833 Sat, 27 Nov 2010 06:00:00 -0000
851 Fri, 04 Dec 2009 06:07:00 -0000
4806 Fri, 23 Mar 2012 06:02:15 -0000
16341 Sat, 20 Aug 2011 11:48:18 -0000
9444 Mon, 16 May 2011 08:06:53 -0000
...
3262 Fri, 16 Dec 2011 07:30:00 -0000
37554 Wed, 11 Apr 2012 02:20:34 -0000
37555 Wed, 11 Apr 2012 02:34:00 -0000
28471 Thu, 18 Feb 2010 04:46:00 -0000
30324 Thu, 28 Jun 2012 21:23:40 -0000
左边的数字是原条目的索引。我希望能够将这个系列分类为各种不同的时间格式,例如按工作日分组(全部分组 "Sat"、全部分组 "Wed" 等)或按月分组("Nov","May").使用此时间码信息(所有条目在 02 小时、06 小时等)按 24 小时制时钟排序甚至会很棒。
目标输出将是(只是对这个样本进行排序):
按月
28471 Feb
4806 Mar
37554 Apr
37555 Apr
9444 May
...
30324 Jun
16341 Aug
17833 Nov
851 Dec
3262 Dec
按工作日
9444 Mon
37554 Wed
37555 Wed
28471 Thu
30324 Thu
...
4806 Fri
851 Fri
3262 Fri
16341 Sat
17833 Sat
按时间
37554 02
37555 02
28471 04
17833 06
4806 06
...
851 06
3262 07
9444 08
16341 11
30324 21
我已经尝试过使用 pd.to_datetime() 函数,但我不确定要为该函数提供什么格式以便它可以理解该系列,此处的说明可能会有所帮助。
对于格式化,您可以使用 pandas.to_datetime() 方法或使用 apply() 方法将 strftime/strptime 应用于系列。稍后您可以对序列或数据框使用 sort_values() 方法以获得预期输出。
参考this documentation for to_datetime() and for formatting refer to this页。
要按星期几排序,我们可以将您的日期转换为实际的日期时间格式 (datetime64
)。然后我们从日期时间中提取 dayofweek
并按该数字对其进行排序:
s = pd.to_datetime(df['Col1'].str.rsplit(n=2).str[0], format='%a, %d %b %Y').dt.dayofweek
df.assign(dayofweek=s).sort_values('dayofweek').drop(columns=['dayofweek'])
输出
Col1
4 Mon, 16 May 2011 08:06:53 -0000
6 Wed, 11 Apr 2012 02:20:34 -0000
7 Wed, 11 Apr 2012 02:34:00 -0000
8 Thu, 18 Feb 2010 04:46:00 -0000
9 Thu, 28 Jun 2012 21:23:40 -0000
1 Fri, 04 Dec 2009 06:07:00 -0000
2 Fri, 23 Mar 2012 06:02:15 -0000
5 Fri, 16 Dec 2011 07:30:00 -0000
0 Sat, 27 Nov 2010 06:00:00 -0000
3 Sat, 20 Aug 2011 11:48:18 -0000
dt.dayofweek
returns 星期几表示为 integer
:
pd.to_datetime(df['Col1'].str.rsplit(n=2).str[0], format='%a, %d %b %Y').dt.dayofweek
0 5
1 4
2 4
3 5
4 0
5 4
6 2
7 2
8 3
9 3
Name: Col1, dtype: int64
您可以对 month
执行相同的操作:
s2 = pd.to_datetime(df['Col1'].str.rsplit(n=2).str[0], format='%a, %d %b %Y').dt.month
df.assign(month=s2).sort_values('month').drop(columns=['month'])
Col1
8 Thu, 18 Feb 2010 04:46:00 -0000
2 Fri, 23 Mar 2012 06:02:15 -0000
6 Wed, 11 Apr 2012 02:20:34 -0000
7 Wed, 11 Apr 2012 02:34:00 -0000
4 Mon, 16 May 2011 08:06:53 -0000
9 Thu, 28 Jun 2012 21:23:40 -0000
3 Sat, 20 Aug 2011 11:48:18 -0000
0 Sat, 27 Nov 2010 06:00:00 -0000
1 Fri, 04 Dec 2009 06:07:00 -0000
5 Fri, 16 Dec 2011 07:30:00 -0000
如果您想要与发布的输出完全一样,您可以这样做,将列名称考虑为 'funded date'
:
月份:
s_month=pd.to_datetime(df['funded date']).dt.month_name().str[:3]
s_month.reindex(pd.to_datetime(df['funded date']).dt.month.sort_values().index)
28471 Feb
4806 Mar
37554 Apr
37555 Apr
9444 May
30324 Jun
16341 Aug
17833 Nov
851 Dec
3262 Dec
当天:
s_day=pd.to_datetime(df['funded date']).dt.day_name().str[:3]
s_day.reindex(pd.to_datetime(df['funded date']).dt.dayofweek.sort_values().index)
9444 Mon
37554 Wed
37555 Wed
28471 Thu
30324 Thu
851 Fri
4806 Fri
3262 Fri
17833 Sat
16341 Sat