Счетчик номер даты, в том числе между двумя датами - PullRequest
0 голосов
/ 25 января 2019

У меня есть такой набор данных:

ID   date         value_1   value_2  tech   start_date  last_date  

ab   2017-06-01   3476.44   324       A     2015-05-04  2018-06-01
ab   2017-07-01   3556.65   332       A     2016-06-07  2018-07-01
ab   2017-08-01   3552.65   120       B     2016-01-08  2018-01-01
ab   2017-09-01   3201.66   987       C     2015-04-08  2018-04-01
bc   2017-10-01   3059.02   652       C     2015-06-09  2018-03-01
bc   2017-11-01   2853.37   345       C     2018-01-01  2018-08-01
bc   2017-12-01   2871.29   554       C     2015-10-01  2018-01-01

Я хочу сохранить ID и технику фиксированными и посчитать, сколько дат включается между start_date и last_date.

Как:

ID  count
ab    4
ab    4
ab    4
ab    4
bc    2
bc    2
bc    2

Я строю функцию для подсчета, а затем я делаю группу по:

def count_c(data):
    d = {}
    d['count'] = np.sum(
        [x > data['start_date  '] & x < data['last_date  '] for x in data['date']])
    return pd.Series(d, index=['count'])
df_model1 = flag.groupby('date').apply(count_c)

1 Ответ

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

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

import pandas as pd
import numpy as np
from datetime import datetime

df = pd.DataFrame(columns=['ID', 'date', 'value_1', 'value_2', 'tech', 'start_date', 'last_date']) # Your DataFrame

days_list = []

РЕДАКТИРОВАТЬ: теперь решение подсчитывает количество строк между start_dateи столбец конечной даты

for i, row in df.iterrows():
    s_date = datetime.strptime(row['start_date'], '%m/%d/%y')
    e_date = datetime.strptime(row['last_date'],'%m/%d/%y')
    days = abs((e_date - s_date).days)
    days_list.append(days)

days_list = np.array(days_list)
df['Days'] = days_list

def dates(df):                                             
    """                                                    
    :param df: DataFrame                                   
    :param start_date: (str) mm/dd/yy                      
    :param end_date: (str) mm/dd/yy                        
    :return: number of rows                                              
    """                                                    

    n = 0                                                  

    for _, ro in df.iterrows():                            
        y = datetime.strptime(ro['start_date'], '%m/%d/%y')
        t = datetime.strptime(ro['last_date'], '%m/%d/%y') 
        d = datetime.strptime(ro['date'], '%m/%d/%y')      
        if y < d < t:                                      
            n += 1                                         

печать (даты (df))

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