pandas в длину и ширину из индекса даты и времени - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть фрейм данных с индексом даты и 2 столбцами:

            val     week
2015-01-02  16729   1
2015-01-09  16225   2
2015-01-16  15250   3
2015-01-23  15690   4
2015-01-30  16025   5
...         ...     ...
2020-03-20  16417   12
2020-03-27  15481   13
2020-04-03  14216   14
2020-04-10  13113   15
2020-04-17  12825   16

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

            2015    ...    2020
01-1        16729   ...    ...
01-2        16225   ...    ...
01-3        15250   ...    ...
01-4        15690   ...    ...
01-5        16025   ...    ...
...         ...     ...    ...
03-12       ...     ...    16417
03-13       ...     ...    15481
04-14       ...     ...    14216
04-15       ...     ...    13113
04-16       ...     ...    12825

Было бы предпочтительнее вместо этого просто сохранить месяц и день в качестве индекса, но, поскольку это недельная частота, фактические даты недели различаются по годам. Не так важно, чтобы даты были точными, если есть способ их свернуть.

            2015    ...    2020
01-02       16729   ...    ...
01-09       16225   ...    ...
01-16       15250   ...    ...
01-23       15690   ...    ...
01-30       16025   ...    ...
...         ...     ...    ...
03-20       ...     ...    16417
03-27       ...     ...    15481
04-03       ...     ...    14216
04-10       ...     ...    13113
04-17       ...     ...    12825

Я пытался использовать pd.Grouper и варианты groupby, но мне кажется, что я не могу понять правильно. Я также открыт для других предложений относительно того, как это устроить, так как идея для каждого года изображать отдельной строкой на одном и том же графике.

1 Ответ

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

после всех комментариев, похоже, пришло время для некоторого кода. Немного хакерски, но, может быть, это тебе поможет:

import numpy as np
import pandas as pd

# example df with some random values.
df = pd.DataFrame({'t': ['2015-01-02','2015-01-03','2015-01-16','2015-01-23','2015-01-30', '2020-01-01'],
                   'val': [16729, 16225, 15250, 15690, 16025, 999],
                   'week': [1, 2, 3, 4, 5, 1]})
df['t'] = pd.to_datetime(df['t'])

# pivot to get years as columns
df1 = pd.pivot_table(df, values='val', columns=df['t'].dt.year, index=df['t'])

# create a new column "date" for later on... cast to datetime object for now
df1['date'] = pd.to_datetime(df1.index.date)

# sum the values for every week and drop the original "t" (datetime) column
df2 = df1.groupby(df1.index.week).resample('W-Mon', on='date').sum().reset_index().sort_values(by='date').drop(columns=['t'])

# drop all rows that only hold zeros
df2 = df2.loc[~np.isclose(df2.loc[:, df2.columns != 'date'], 0)]

# finally, format the datetime column to string as desired
df2['month-week'] = df2['date'].dt.strftime('%m-%W')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...