Получить счет за день, заданные периоды времени - PullRequest
0 голосов
/ 01 декабря 2018

Примерный фрейм данных:

    id           start1        end1      start2        end2
0  Bob       2018-11-29  2018-11-30  2018-12-01  2018-12-31
1  James     2018-10-19  2018-10-31         NaT         NaT
2  Jane      2018-04-05  2018-07-12  2018-11-29  2018-11-30

Учитывая приведенный выше примерный фрейм данных, я хотел бы показать счетчик частоты по месяцам и годам.Предположим, что в эти периоды каждый человек (id) чем-то «подвергался воздействию».Для каждого человека может быть до двух периодов времени (всегда будет хотя бы один период времени (т. Е. start1 и end1), но может быть или не быть второго (т. Е. start2 и * 1008).*)).Я хочу показать, сколько людей было затронуто месяцем и годом за весь период времени, в течение которого кто-либо был затронут.

Например, приведенные выше данные приведут к чему-то вроде этого (не уверен, что год-месяц будетодин и тот же столбец или несколько - все, что работает):

   year-month  count
0     2018-04      1
1     2018-05      1
2     2018-06      1
3     2018-07      1
4     2018-08      0
5     2018-09      0
6     2018-10      1
7     2018-11      2
8     2018-12      1

Моя конечная цель - рассмотреть их в разные периоды времени (например, год (все данные представлены в 2018 году в данных этого примера), месяц / год,неделю и т. д.).

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

df.groupby(df["date"].dt.month).count().plot(kind="bar")

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

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

1 Ответ

0 голосов
/ 01 декабря 2018

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

from pandas.tseries.offsets import MonthEnd

newdf=pd.wide_to_long(df,['start','end'],i='id',j='drop')
newdf=newdf.apply(pd.to_datetime)
newdf=newdf.dropna()
newdf.start=newdf.start.values.astype('datetime64[M]')
newdf.end=newdf.end+MonthEnd(0)
newdf
                start        end
id    drop                      
Bob   1    2018-11-01 2018-11-30
James 1    2018-10-01 2018-10-31
Jane  1    2018-04-01 2018-07-31
Bob   2    2018-12-01 2018-12-31
Jane  2    2018-11-01 2018-11-30

Затем мы используем date_range

l=[pd.date_range(x,y,freq='M',closed ='right').strftime('%Y-%m') for x ,y in zip(newdf.start,newdf.end)]
pd.Series(np.concatenate(l)).value_counts()
2018-11    2
2018-05    1
2018-12    1
2018-04    1
2018-06    1
2018-10    1
2018-07    1
dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...