DataFrame создает дополнительный столбец интервал / диапазон / период - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть фрейм данных, начиная с августа 2019 года и до апреля 2020 года.

Я хотел бы добавить столбцовую / категориальную переменную к этому фрейму данных, а затем группировать и агрегировать по этому недавно введенному столбцу.

У меня есть столбец даты в этом кадре данных. type(df["Date"].iloc[0]) и оценивается как datetime.date

У меня также есть столбец в этом фрейме данных с указанием недели df["Week].

Пока что я написал функцию, которая классифицирует на основе недели:

def time_intervals(week):
    if 33 <= week < 35:
        return "Interval 1"
    elif 35 <= week < 37:
        return "Interval 2"
    ....

И затем сопоставил эту функцию с существующим столбцом. df["Interval"] = df["Week"].map(time_intervals)

Теперь это не самое умное решение, и оно определенно вызовет проблему, когда данные перекрываются между 2019 и 2020 годами. Есть ли более умный способ создания таких интервалов в pandas?

1 Ответ

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

Как насчет определения количества недель от минимальной даты и использования pd.cut для определения интервалов, которые кажутся каждые две недели, например:

idx = pd.date_range('2019-08-01', '2020-04-30', freq='1D')
data = np.random.rand(len(idx))

# Example dataframe
df = pd.DataFrame(dict(data=data), index=idx)
min_date = df.index.min()

# Number of weeks from min date
df['week_from_start'] = (df.index - min_date).days//7
bins = [x for x in range(0, df['week_from_start'].max()+2, 2)]

# Define intervals using cut and some predefined bins
df['Interval'] = pd.cut(df['week_from_start'], bins, labels=False, right=False)

# Convert intervals from integers to strings
df['Interval'] = 'Interval ' + (df['Interval'] + 1).astype(str)
df['Interval'].iloc[[1,50,100]]

# 2019-08-02    Interval 1
# 2019-09-20    Interval 4
# 2019-11-09    Interval 8
...