Как разделить значение месяца на число дней по R или python? - PullRequest
0 голосов
/ 31 января 2019

Мои данные:

Month  column_1 column_2
201801  31      62
201802  28      56
...
201812

Я хочу, чтобы выходные данные могли быть:

Date       column_1  column_2
2018-01-01    1        2
2018-01-02    1        2
...
2018-01-31    1        2
2018-02-01    1        2
...
2018-12-31   ..........

Я хочу усреднить каждое значение месяца в значение даты.

Какая функцияМогу ли я сделать ссылку, чтобы сделать это?Огромное спасибо.

1 Ответ

0 голосов
/ 31 января 2019

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

Давайте начнем с фрейма данных, аналогичного примеру, который выдал, но только за январь и февраль:

import pandas as pd

df = pd.DataFrame({'column_1':[31,28], 'column_2':[62,56]}, index=[201801, 201802])
df.index.name='Month'

Что выглядит так:

        column_1    column_2
Month       
201801        31          62
201802        28          56

Теперь нам нужно переформатировать, как отображаются месяцы в индексе, чтобы мы могли изменитьтип данных индекса в Pandas period_range :

df.index = df.index.map(str)
df.index = df.index.str[0:4] + '-' + df.index.str[-2:]
df.index = pd.period_range(start=df.index.values[0], periods=len(df.index.values), freq='m')

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

df = df.resample('D').ffill()

СейчасУ нас есть записи для каждого дня, которые выглядят так:

            column_1  column_2
2018-01-01        31        62
2018-01-02        31        62
2018-01-03        31        62
2018-01-04        31        62
...
2018-02-25        28        56
2018-02-26        28        56
2018-02-27        28        56
2018-02-28        28        56

Но мы еще не закончили.Нам по-прежнему необходимо отображать средние значения daily этих месячных значений.Для этого нам нужно знать количество дней в каждом календарном месяце.Следующие шаги позволяют нам получить количество дней для каждого месяца, а затем вычислить среднесуточные значения для каждой строки столбца без использования цикла for:

daily = df.groupby(pd.Grouper(freq='M')).count()
daily = daily.iloc[:,0]
daily = daily.resample('D').ffill().rename('days_in_month')
df = df.join(daily)
cols = ['column_1', 'column_2']
for col in cols:
    df[col] = df[col]/df['days_in_month']
df = df.drop('days_in_month', axis=1)

Теперь наш информационный кадр находится вв правильном формате и отображает среднесуточное значение (усредненное по количеству календарных дней в этом месяце) значения каждого месяца:

            column_1    column_2
2018-01-01       1.0         2.0
2018-01-02       1.0         2.0
2018-01-03       1.0         2.0
2018-01-04       1.0         2.0
2018-01-05       1.0         2.0
...
2018-02-24       1.0         2.0
2018-02-25       1.0         2.0
2018-02-26       1.0         2.0
2018-02-27       1.0         2.0
2018-02-28       1.0         2.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...