日期的计数器编号,包括两个日期之间的日期

时间:2019-01-25 16:41:53

标签: python-3.x group-by pandas-groupby

我有一个这样的数据集:

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和技术不变,并计算开始日期和最后日期之间阴天的日期。

赞:

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 :(得分:0)

实际上非常简单,而不是使用函数,而使用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 = []

编辑:现在,解决方案计算开始日期和结束日期列之间的行数

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))