Ограничить повторную выборку месяцами в многолетнем фрейме данных - PullRequest
0 голосов
/ 28 июня 2018

Рассмотрим этот набор данных о погоде (данные о погоде за 50 лет с интервалом в 3 часа):

                     YEAR   M   D   H   WSP   HS
1957-09-01 06:00:00  1957   9   1   6   8.9  0.9
1957-09-01 09:00:00  1957   9   1   9   6.4  0.6
1957-09-01 12:00:00  1957   9   1  12   5.2  0.4
1957-09-01 15:00:00  1957   9   1  15   1.9  0.3
1957-09-01 18:00:00  1957   9   1  18   3.7  0.3
1957-09-01 21:00:00  1957   9   1  21   3.9  0.4
1957-09-02 00:00:00  1957   9   2   0   5.6  0.4
1957-09-02 03:00:00  1957   9   2   3   5.3  0.5

Мне нужно пересчитать набор данных в 48-часовые периоды и получить максимальное значение HS для этого интервала. Затем это значение должно быть сгруппировано по месяцам, чтобы получить среднее значение за 50-летний период для каждого месяца.

Однако повторная выборка часто может включать диапазон значений за два месяца:

1957-09-04 12:00:00  1957   9   4  12   7.8  1.1
1957-09-04 15:00:00  1957   9   4  15   6.7  1.1
1957-09-04 18:00:00  1957   9   4  18   9.4  1.1
1957-09-04 21:00:00  1957   9   4  21   9.7  1.2
1957-09-05 00:00:00  1957   9   5   0   8.9  1.2
1957-09-05 03:00:00  1957   9   5   3   9.0  1.1

Мне нужно, чтобы повторная выборка была ограничена ТОЛЬКО месяцем, чтобы среднее значение за месяц по всему набору данных не искажалось данными других месяцев.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Примечание : Я немного расширил ваш набор данных некоторыми телефонными данными, чтобы лучше проиллюстрировать группировки. Также было добавлено имя столбца (DT) для даты и времени. Набор данных можно найти здесь: weather.csv

df = pd.DataFrame()
df = pd.read_csv('./data/weather.csv')

df['date'] = pd.to_datetime(df['DT'], format='%Y-%m-%d %H:%M:%S')

# Grouping by 48 hours with a base of 0 (so the start of the grouping window begins midnight - and without a time)
# The max returns the highest number from the HS column.
df_48h = df.groupby(pd.Grouper(key='date', freq='48h', base=0))['HS'].max()
print(df_48h)

# Output:
# date
# 1957-09-01    0.6
# 1957-09-03    0.9
# ...
# 1957-10-01    0.6
# 1957-10-03    0.9

# Group all the 'high' values by month and get the mean
df_mm = df_48h.groupby(pd.Grouper(freq='M')).mean()
print(df_mm)

# Output:
# date
# 1957-09-30    0.75
# 1957-10-31    0.75

Блокнот Jupyter, в котором я играл, можно найти здесь: pandas_48h_and_month_grouping.ipynb

Надеюсь, это поможет, наслаждайтесь!

0 голосов
/ 28 июня 2018

Сначала возьмите данные за один месяц и рассчитайте среднее значение HS для 48-часовых периодов (начиная с 00:00 часов в день 1 до 24:00 часов в день 2 и т. Д. [Обратите внимание, что последний период может быть менее 48 часов], затем повторите это для следующего месяца и т. д. Чтобы получить среднее значение за месяц, возьмите среднее значение для всех 48 часовых периодов в месяц (будет 14, 15 или 16 в зависимости от месяца) Сказав это, не будет ли намного проще взять среднее значение данных за один месяц, я не уверен, почему вы хотите сначала сгруппировать его по 48 часам?

...