Повторная выборка за несколько лет в pandas - PullRequest
1 голос
/ 26 апреля 2020

У меня есть данные за все дни за несколько лет (за 10-летний период с 2004 по 2014 год). Я хочу найти максимальные и минимальные значения за этот период для всех дней в 10 лет, например. Каково максимальное значение для 1 января за все годы между 2004 и 2014 годами. Как бы я сделал это, используя resample в pandas? См. Это изображение

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Я предлагаю это, если вы хотите, чтобы исходные даты были связаны с максимальными и минимальными значениями (на основе вопрос ):

import pandas as pd
import numpy as np
np.random.seed(13)
df = pd.DataFrame({"date":pd.date_range("2004-01-01", freq="D", periods=5000),
                   "value": np.random.randint(0,100,5000)})
df["day"] = df.date.dt.day
df["month"] = df.date.dt.month
df = df.set_index("date")
idx = df.groupby(['month', 'day'])['value'].transform(max) == df['value']
max_df = df[idx].sort_values(["month", "day"])
idx = df.groupby(['month', 'day'])['value'].transform(min) == df['value']
min_df = df[idx].sort_values(["month", "day"])

И результат, например, для max_df:

           value  day  month
date                         
2010-01-01     88    1      1
2008-01-02     88    2      1
2011-01-03     94    3      1
2009-01-04     98    4      1
2004-01-05     98    5      1

Вы можете иметь несколько строк для одного дня и месяца, если существует несколько максимумов.

0 голосов
/ 26 апреля 2020

Использование:

rng = pd.date_range('2004-01-01', '2014-12-31')
df = pd.DataFrame({'Date': rng, 'Max': range(len(rng))})  
print (df)
           Date   Max
0    2004-01-01     0
1    2004-01-02     1
2    2004-01-03     2
3    2004-01-04     3
4    2004-01-05     4
        ...   ...
4013 2014-12-27  4013
4014 2014-12-28  4014
4015 2014-12-29  4015
4016 2014-12-30  4016
4017 2014-12-31  4017

[4018 rows x 2 columns]

Сначала преобразуйте столбец Date в дату и время на to_datetime, затем создайте пользовательский формат MM-DD на Series.dt.strftime и последний агрегат max:

df['Date'] = pd.to_datetime(df['Date'])
#if necessary sorting
#df = df.sort_values('Date')
md = df['Date'].dt.strftime('%b-%d')
df = df.groupby(md, sort=False)['Max'].max().reset_index()
print (df)
       Date   Max
0    Jan-01  3653
1    Jan-02  3654
2    Jan-03  3655
3    Jan-04  3656
4    Jan-05  3657
..      ...   ...
361  Dec-27  4013
362  Dec-28  4014
363  Dec-29  4015
364  Dec-30  4016
365  Dec-31  4017

[366 rows x 2 columns]
...