2015-08-22 3 views
2

У меня есть столбец (из моих исходных данных), который я преобразовал из строки в объект datetime в Pandas.Pandas: частота подсчета объектов datetime в столбце

Колонка выглядит следующим образом:

0  2012-01-15 11:10:12 
1  2012-01-15 11:15:01 
2  2012-01-16 11:15:12 
3  2012-01-16 11:25:01 
... 
4  2012-01-22 11:25:11 
5  2012-01-22 11:40:01 
6  2012-01-22 11:40:18 
7  2012-01-23 11:40:23 
8  2012-01-23 11:40:23 
... 
9  2012-01-30 11:50:02 
10 2012-01-30 11:50:41 
11 2012-01-30 12:00:01 
12 2012-01-30 12:00:34 
13 2012-01-30 12:45:01 
... 
14 2012-02-05 12:45:13 
15 2012-01-05 12:55:01 
15 2012-01-05 12:55:01 
16 2012-02-05 12:56:11 
17 2012-02-05 13:10:01 
... 
18 2012-02-11 13:10:11 
... 
19 2012-02-20 13:25:02 
20 2012-02-20 13:26:14 
21 2012-02-20 13:30:01 
... 
22 2012-02-25 13:30:08 
23 2012-02-25 13:30:08 
24 2012-02-25 13:30:08 
25 2012-02-26 13:30:08 
26 2012-02-27 13:30:08 
27 2012-02-27 13:30:08 
28 2012-02-27 13:30:25 
29 2012-02-27 13:30:25 

То, что я хотел бы сделать, это подсчитать частоту каждой даты происходящего. Как вы можете видеть, я оставил некоторые даты, но если бы я, чтобы вычислить частоту вручную (для видимых значений), я бы:

2012-01-15 - 2 (частота)

2012-01-16 - 2

2012-01-22 - 3

2012-01-23 - 2

2012-01-30 - 5

2012-02-05 - 5

2012-02-11 - 1

2012-02-20 - 3

2012-02-25 - 3

2012-02-26 - 1

2012-02-27 - 4

Это ежедневная частота, и я хотел бы считать. Я до сих пор попытался это:

df[df.str.contains(r'^\d\d\d\d-\d\d-\d\d')].value_counts() 

Я знаю, что он не потому, что они не являются «строка» объекты, но я не знаю, как еще посчитать это.

Я также посмотрел на свойство .dt, но документация Pandas очень многословна для этих простых вычислений частоты.


Кроме того, чтобы обобщить это, как бы я:

  1. Наносить ежедневно частоту еженедельной частоты (., Например, с понедельника по воскресенье)
  2. Нанести дневной частоту месячной частоты (например, как. много раз я вижу «2012-01 - **» в моей колонке)
  3. Использование ежедневных/еженедельных/ежемесячных ограничений для других столбцов (например, если у меня есть столбец, содержащий «запросы GET», я хотел бы знать сколько произошло ежедневно, затем еженедельно, а затем ежемесячно)
  4. Применение еженедельного ограничения с другим ограничением (например. У меня есть столбец, который возвращает «404 Не найдено», и я хотел бы проверить, сколько «404 Не нашел, что я получил за неделю»)

Возможно, решение является долгим, где я могу нужно сделать много: split-apply-comb ...но я был убежден, что Панда упрощает/отнимает много работы, поэтому я застрял сейчас.

Источник этого файла может считаться чем-то эквивалентным файлу сервера-журнала.

ответ

2

Вы можете сначала получить дату часть DateTime, а затем использовать value_counts:

s.dt.date.value_counts() 

Небольшой пример:

In [12]: s = pd.Series(pd.date_range('2012-01-01', freq='11H', periods=6)) 

In [13]: s 
Out[13]: 
0 2012-01-01 00:00:00 
1 2012-01-01 11:00:00 
2 2012-01-01 22:00:00 
3 2012-01-02 09:00:00 
4 2012-01-02 20:00:00 
5 2012-01-03 07:00:00 
dtype: datetime64[ns] 

In [14]: s.dt.date 
Out[14]: 
0 2012-01-01 
1 2012-01-01 
2 2012-01-01 
3 2012-01-02 
4 2012-01-02 
5 2012-01-03 
dtype: object 

In [15]: s.dt.date.value_counts() 
Out[15]: 
2012-01-01 3 
2012-01-02 2 
2012-01-03 1 
dtype: int64 
+0

Как бы я использовать дату как ограничение для подсчета частоты другого столбцы? Или я бы использовал для этого набор массивов? – Joe

+0

Что ты имеешь в виду? Можете ли вы привести пример? Если вы хотите рассчитывать на основе нескольких столбцов, вы можете использовать 'groupby ([..]). Count()' – joris

+0

Я упомянул об этом выше в моих 4 баллах. Я хотел бы обобщить частоту подсчета (неделя) и (месяц). Хотя я мог бы просто добавить 7 ежедневных частот в неделю и 30 ежедневных частот в течение месяца, проблема будет возникать, когда я хочу сравнить сценарий, в котором я рассчитываю «Запросы GET» в неделю/месяц. Должен ли я разбивать DataFrame, чтобы сделать это? Если да, то как бы я разделил его равномерно (по дате: например, разделите свои данные на 1 января до 31 января, с 1 февраля по 28 февраля, с 1 марта по 31 марта и т. Д.) – Joe

Смежные вопросы