Интерполяция строк месяца в строки дня - PullRequest
0 голосов
/ 10 января 2020

"" "ТАК." "" У меня есть данные о доходах магазина каждый месяц. Как создать ежедневные строки для каждого месяца?

df = pd.DataFrame({
    'date': ['2019-01-01','2019-01-01','2019-01-01','2019-02-01',
        '2019-02-01','2019-02-01','2019-03-01','2019-03-01','2019-03-01'],
    'Company': ['Store A', 'Store B', 'Store C', 'Store A', 'Store B', 
        'Store C','Store A', 'Store B', 'Store C'],
    'Monthly Revenue': [200, 800, 400, 400, 300, 600, 400, 400, 900]
})

print(df)

         date  Company  Monthly Revenue
0  2019-01-01  Store A              200
1  2019-01-01  Store B              800
2  2019-01-01  Store C              400
3  2019-02-01  Store A              400
4  2019-02-01  Store B              300
5  2019-02-01  Store C              600
6  2019-03-01  Store A              400
7  2019-03-01  Store B              400
8  2019-03-01  Store C              900

Желаемый результат:

         date  Company  Monthly Revenue
0  2019-01-01  Store A              200
1  2019-01-02  Store A              200
2  2019-01-03  Store A              200
3  2019-01-04  Store A              200
........
30  2019-01-31 Store A              200
31  2019-02-01 Store A              400
32  2019-02-02 Store A              400
32  2019-02-03 Store A              400

Обратите внимание, что каждый месяц имеет определенное количество дней c. Все мои данные за месяц с января по декабрь, поэтому правильное количество ежедневных строк должно соответствовать количеству дней в месяце (31 строка для января, 28 строк в феврале, 31 строка в марте и т. Д. c).

1 Ответ

1 голос
/ 11 января 2020

Если столбец date начинается с первого дня месяца для каждого магазина, вы можете сделать .pivot_table(), а затем повторить выборку с .ffill():

df = pd.DataFrame({'date': ['2019-01-01','2019-01-01','2019-01-01','2019-02-01','2019-02-01','2019-02-01',
                           '2019-03-01','2019-03-01','2019-03-01'],
                   'Company': ['Store A', 'Store B', 'Store C', 'Store A', 'Store B', 'Store C',
                              'Store A', 'Store B', 'Store C'],
                   'Monthly Revenue': [200, 800, 400, 400, 300, 600, 400, 400, 900]})
df['date'] = pd.to_datetime(df['date'])

df = pd.DataFrame(pd.concat([df['date'],  df['date'] + pd.tseries.offsets.MonthEnd(1)]), columns=['date']).combine_first(df)
df = df.pivot_table(index='date', columns='Company').resample('D').ffill().reset_index()
print(df)

Отпечатки:

              date Monthly Revenue                
Company                    Store A Store B Store C
0       2019-01-01           200.0   800.0   400.0
1       2019-01-02           200.0   800.0   400.0
2       2019-01-03           200.0   800.0   400.0
3       2019-01-04           200.0   800.0   400.0
4       2019-01-05           200.0   800.0   400.0
..             ...             ...     ...     ...
85      2019-03-27           400.0   400.0   900.0
86      2019-03-28           400.0   400.0   900.0
87      2019-03-29           400.0   400.0   900.0
88      2019-03-30           400.0   400.0   900.0
89      2019-03-31           400.0   400.0   900.0

[90 rows x 4 columns]

Если вам нужно это в один ряд, вы можете сделать дополнительно:

df = df.melt(id_vars='date')
print(df[['date', 'Company', 'value']]) 

Это напечатает:

          date  Company  value
0   2019-01-01  Store A  200.0
1   2019-01-02  Store A  200.0
2   2019-01-03  Store A  200.0
3   2019-01-04  Store A  200.0
4   2019-01-05  Store A  200.0
..         ...      ...    ...
265 2019-03-27  Store C  900.0
266 2019-03-28  Store C  900.0
267 2019-03-29  Store C  900.0
268 2019-03-30  Store C  900.0
269 2019-03-31  Store C  900.0

[270 rows x 3 columns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...