мультиусловный счетчик по датам - PullRequest
0 голосов
/ 25 марта 2019

У меня есть этот фрейм данных

df:
    entrance   leaving        counter
1   2012-07-01  NaT             NaN
2   2013-03-15  NaT             NaN
3   2013-03-15  2013-04-15      NaN
4   2014-06-01  NaT             NaN
5   2014-06-01  NaT             NaN

Мне нужен счетчик, который учитывает две колонки с датами и приращениями по entrance датам и убываниям при leaving датах. Кроме того, следующий столбец date также должен увеличиваться на один месяц. Желаемый результат должен быть:

df_new:
date      counter
2012-07     1
2012-08     1              
  ...      ...             
2013-03     2
  ...      ...
2014-06     4

Я сделал эту строку, где она увеличивается на основе entrance, но я не мог использовать np.where() для уменьшения, если `df.entrance.notnull () '.

df.groupby([df['entrance'].dt.to_period("M")]).entrance.count().cumsum()

1 Ответ

0 голосов
/ 25 марта 2019

Я считаю, что ваша проблема не указана.Счетчик не может разделить индекс исходного DF.Вот пример того, почему:

    # Lets assume this is the DF:
    entrance   leaving        counter
1   2012-07-01  NaT             1
2   2013-03-15  NaT             2
3   2013-03-15  2013-06-15      2 ?
4   2013-06-01  NaT             3 or 4? Depends if you count the exit in prev row or not

В любом случае, вот решения:

# Load Data
s = '''     entrance   leaving        counter
1   2012-07-01  NaT             NaN
2   2013-03-15  NaT             NaN
3   2013-03-15  2013-04-15      NaN
4   2014-06-01  NaT             NaN
5   2014-06-01  NaT             NaN'''

df = pd.DataFrame.from_csv(io.StringIO(s), sep='\s+')
df['leaving']= pd.to_datetime(df['leaving'])
df['entrance']= pd.to_datetime(df['entrance'])

Однозначное решение, которое не будет следовать исходному индексу:

# Counter
counter = pd.Series(1, df['entrance'].dropna()).subtract(pd.Series(1, df['leaving'].dropna()), fill_value=0).cumsum()

# If you want it monthly
counter.resample('M').last().ffill()

Решение, которое поддерживает исходный индекс, но несколько двусмысленно:

count_df = df.notna().cumsum()
df['counter'] = count_df['entrance'] - count_df['leaving']
...