Как мне отсортировать / сгруппировать серию панд тайм-кода по дням недели, месяцу и т. Д. В Python?

У меня есть серия панд, которую я извлек из фрейма данных в Python 3.7. Он содержит ряд временных кодов, например:

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

Цифры слева - это индексы исходных записей. Я хотел бы иметь возможность отсортировать эту серию по множеству альтернативных форматов времени, таких как группировка по дням недели (сгруппировать все «Сб», сгруппировать все «Ср» и т. Д.) Или сгруппировать по месяцам («Ноябрь», «Май») . Было бы неплохо даже сортировать по часам в 24-часовых часах, используя эту информацию о тайм-коде (все записи в час 02, час 06 и т. Д.).

Целевые результаты будут (просто отсортируя этот образец):

по месяцам

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 (), но я не уверен, какое форматирование придать этой функции, чтобы она могла понять серию, пояснения здесь могут быть полезны.


person paranoiddandroid    schedule 10.08.2019    source источник
comment
Вы тоже можете опубликовать ожидаемый результат?   -  person anky    schedule 10.08.2019
comment
отредактирован для обеспечения вывода, спасибо!   -  person paranoiddandroid    schedule 10.08.2019
comment
Ваши данные всего в одном столбце?   -  person Erfan    schedule 10.08.2019
comment
Этот извлеченный ряд представляет собой один столбец из фрейма данных df ['финансируемая дата']. Я уже сгруппировал его с другим столбцом df [«профинансированный процент»], поскольку я пытаюсь сделать вывод, в какие месяцы / будние дни / время было лучшее финансирование.   -  person paranoiddandroid    schedule 10.08.2019


Ответы (3)


Если вы хотите точно такой же, как ваш опубликованный результат, вы можете сделать это, учитывая имя столбца как '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
person anky    schedule 10.08.2019

Для сортировки по дням недели мы можем преобразовать вашу дату в фактический формат даты и времени (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 возвращает ряд с днем ​​недели, представленным как 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
person Erfan    schedule 10.08.2019

Для форматирования вы можете использовать метод pandas.to_datetime () или просто применить strftime / strptime к серии с помощью метода apply (). Позже вы можете использовать метод sort_values ​​() для серии или фрейма данных для ожидаемого результата.

См. эту документацию для to_datetime () а для форматирования см. эту страницу.

person null    schedule 10.08.2019