Я работаю над dataFrame с данными за несколько лет с отметкой времени для каждого значения. Я борюсь с сортировкой данных за летние / не летние месяцы. Я не уверен, как сказать пандам, чтобы они получали данные с датами 15 июня по 15 сентября, однако отбрасывая год.
df['is_summer'] = df['Date'].dt.month.between(6,9) # This works for June 1 to September 30 for every year
# I want to do this, this is pseudo code
df['is_summer'] = df['Date'].dt.day.between(6-15,9-15) # From June 15 to September 15 for every year
# I also want to this
df['is_late_night'] = df['Date'].dt.time.between(20:00,23:59) # From 20:00 to 23:59 for every day
Мне трудно найти документацию для этого. Я хочу знать правильный синтаксис для .between () для времени, месяца, дня и года. Спасибо вам за помощь
3 ответа
Вы можете использовать булеву маску для фильтрации кадра данных pandas, она будет выглядеть примерно так:
import numpy as np
import pandas as pd
# creating random date ranging across many years
df = pd.DataFrame(np.random.random((1000,3)))
df['date'] = pd.date_range('2000-1-1', periods=1000, freq='D')
# Creating the boolean mask to keep everything from June to August
mask = (df['date'].dt.month > 6) & (df['date'].dt.month <= 8)
# Applying the boolean mask to the data frame an printing it
print(df.loc[mask])
Создание маски может быть встроено в этап фильтрации, поэтому в вашем случае решение является однострочным
only_summer_data = df.loc[(df['date'].dt.month >= 6) & (df['date'].dt.month <= 8))
Если вы тоже хотите провести день, мы получим следующее:
start_mask = ((df['date'].dt.month == 6) & (df['date'].dt.day >= 15)) | (df['date'].dt.month > 6)
end_mask = ((df['date'].dt.month == 8) & (df['date'].dt.day <= 15)) | (df['date'].dt.month < 8)
mask = start_mask & end_mask
print(df.loc[mask])
Однако, поскольку контроль над фильтрацией даты более детализирован, решение с логической маской может стать действительно многословным.
Используйте dayofyear
компонент для определения диапазона и сравнения - это позволит вам ограничить фильтр диапазоном дат без учета года.
>>> start = pd.to_datetime('06-15-2000').dayofyear
>>> end = pd.to_datetime('09-15-2000').dayofyear
>>> start,end
(167, 259)
>>> df = pd.DataFrame(pd.date_range('2010-01-01', periods=52, freq='SM'),columns=['Date'])
>>> df[(df['Date'].dt.dayofyear >= start) & (df['Date'].dt.dayofyear <= end)]
Date
11 2010-06-30
12 2010-07-15
13 2010-07-31
14 2010-08-15
15 2010-08-31
16 2010-09-15
35 2011-06-30
36 2011-07-15
37 2011-07-31
38 2011-08-15
39 2011-08-31
40 2011-09-15
>>>
Или же
>>> df.loc[df['Date'].dt.dayofyear.between(start,end)]
Я бы разделил это на 3 более простых условия
df = pd.DataFrame({'date': pd.date_range(start='1/1/2016', end='1/08/2018')})
select_month78 = df.date.dt.month.between(7,8)
select_month6 = (df.date.dt.month==6) & (df.date.dt.day >= 15)
select_month9 = (df.date.dt.month==9) & (df.date.dt.day <= 15)
df['is_summer'] = select_month78 | select_month6 | select_month9
df[df.is_summer]
Выход:
date is_summer
166 2016-06-15 True
167 2016-06-16 True
168 2016-06-17 True
169 2016-06-18 True
170 2016-06-19 True
.. ... ...
619 2017-09-11 True
620 2017-09-12 True
621 2017-09-13 True
622 2017-09-14 True
623 2017-09-15 True
[186 rows x 2 columns]
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.