Получите среднее количество записей в месяц с датой и временем в Pandas

У меня есть большой df с большим количеством записей в месяц. Я хотел бы увидеть среднее количество записей в месяц, чтобы увидеть, например, есть ли какие-либо месяцы, в которых обычно больше записей. (В идеале я хотел бы построить это с помощью линии общего среднего значения для сравнения, но это, возможно, более поздний вопрос). Мой df выглядит примерно так:

ufo=pd.read_csv('https://raw.githubusercontent.com/justmarkham/pandas-videos/master/data/ufo.csv')
ufo['Time']=pd.to_datetime(ufo.Time)

Где голова выглядит так: Получите среднее количество записей в месяц с датой и временем в Pandas

Так что, если я хочу посмотреть, будет ли больше наблюдений НЛО летом, например, как мне поступить?

Я пытался:

ufo.groupby(ufo.Time.month).mean()

Но это работает, только если я вычисляю числовое значение. Если я использую count()вместо этого, я получаю сумму всех записей за все месяцы.

Обновлено: Чтобы уточнить, я хотел бы иметь среднее количество записей - наблюдений НЛО - в месяц.

ufo.groupby(ufo.Time.month).size()?
Quang Hoang 29.05.2019 11:37

Я не уверен, что ты имеешь в виду. Например, возьмем январь 1930 года. Что вы имеете в виду под «средним количеством записей» в этом месяце? Как бы вы рассчитали это вручную?

pmarcol 29.05.2019 11:39

@pmarcol вручную я бы посчитал все записи января, а затем разделил на количество «январей», которые есть с начала df до последней записи df. И так с каждым месяцем.

Mactilda 29.05.2019 11:45

@QuangHoang, тогда я все еще получаю сумму всех записей за каждый месяц. Есть ли способ узнать, сколько из каждого месяца присутствует? я. е. от первой до последней записи, сколько ян, фев и т. д. есть? а затем разделить на это серию, которую я получаю от вашей команды?

Mactilda 29.05.2019 11:48

Вы должны указать свое уточнение выше в вопросе.

Quang Hoang 29.05.2019 11:51

@Mactilda Мактильда, теперь понятно. Тогда я бы определенно предложил извлечь месяц и рассчитать количество с помощью группы, группируя по извлеченному месяцу. Затем среднее значение можно рассчитать путем деления на общее количество конкретных месяцев в общем временном интервале.

pmarcol 29.05.2019 11:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
1 652
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы имеете в виду, что хотите сгруппировать данные по месяцам? Я думаю, мы можем это сделать

ufo['month'] = ufo['Time'].apply(lambda t: t.month)
ufo['year'] = ufo['Time'].apply(lambda t: t.year)

Таким образом, у вас будет «год» и «месяц» для группировки данных.

ufo_2 = ufo.groupby(['year', 'month'])['place_holder'].mean()

Что такое «заполнитель»? Что оно делает?

Mactilda 29.05.2019 11:50

Это означает, что я применил метод mean() к столбцу с именем «palce_holder», которого нет в вашем наборе данных. Поэтому вы можете подсчитать «месяц» и создать новый столбец с именем «month_count». Тогда вы должны получить желаемый результат.

N. Arunoprayoch 29.05.2019 11:57

Вы можете сделать что-то вроде этого:

# count the total months in the records
def total_month(x):
    return x.max().year -x.min().year + 1

new_df = ufo.groupby(ufo.Time.dt.month).Time.agg(['size', total_month])

new_df['mean_count'] = new_df['size'] /new_df['total_month']

Выход:

    size    total_month     mean_count
Time            
1   862     57              15.122807
2   817     70              11.671429
3   1096    55              19.927273
4   1045    68              15.367647
5   1168    53              22.037736
6   3059    71              43.084507
7   2345    65              36.076923
8   1948    64              30.437500
9   1635    67              24.402985
10  1723    65              26.507692
11  1509    50              30.180000
12  1034    56              18.464286

Да, это то, что я искал. Мне интересно, не следует ли включать все месяцы, даже если, так сказать, не было никаких наблюдений, чтобы получить статистически правильный материал. Поскольку есть 57 января и 70 февраля, можно подумать, что они не будут различаться более чем на один. Вы понимаете, что я имею в виду?

Mactilda 29.05.2019 12:18

Я думаю, что это был бы правильный момент. Средний подсчет за 71 год записей имеет больше смысла.

Quang Hoang 29.05.2019 12:20
Ответ принят как подходящий

Я думаю, что это то, что вы ищете, но, пожалуйста, попросите разъяснений, если я не нашел то, что вы ищете.

# Add a new column instance, this adds a value to each instance of ufo sighting
ufo['instance'] = 1

# set index to time, this makes df a time series df and then you can apply pandas time series functions.  
ufo.set_index(ufo['Time'], drop=True, inplace=True)   

# create another df by resampling the original df and counting the instance column by Month ('M' is resample by month)
ufo2 = pd.DataFrame(ufo['instance'].resample('M').count())

# just to find month of resampled observation
ufo2['Time'] = pd.to_datetime(ufo2.index.values)

ufo2['month'] = ufo2['Time'].apply(lambda x: x.month)

и, наконец, вы можете группировать по месяцам :)

ufo2.groupby(by='month').mean()

и это вывод, который выглядит так:

month   mean_instance
1       12.314286
2       11.671429
3       15.657143
4       14.928571
5       16.685714
6       43.084507
7       33.028169
8       27.436620
9       23.028169
10      24.267606
11      21.253521
12      14.563380

Другие вопросы по теме