2016-08-18 8 views
0

「開始日」と「終了日」の顧客リストがあります。任意の期間、私の目標は、私が活動している顧客の数を見つけることです。顧客の開始日がxより前で、終了日がxから後である場合、顧客はアクティブです。私はこれのブルートフォース版を書いた:pandas月末のリストの日付間のカウントを見つける

from datetime import datetime 
import pandas as pd 

#dates of interest 
dates = ['2016-01-31','2016-02-29','2016-03-31','2016-04-30','2016-05-31'] 
dates = [datetime.strptime(x, '%Y-%m-%d') for x in dates] 

#sample records 
df = pd.DataFrame([['A','2016-01-01','2016-04-23'],['B','2016-02-05','2016-04-30'],['C','2016-02-02','2016-05-25']],columns = ['customerId','startDate','endDate']) 
df['startDate'] = pd.to_datetime(df['startDate']) 
df['endDate'] = pd.to_datetime(df['endDate']) 

output = [] 
#is there a better way to do this? 
for currDate in dates: 
    record_count = len(df[(df['startDate']<= currDate) & (df['endDate']>= currDate)]) 
    output.append([currDate,record_count]) 


output = pd.DataFrame(output, columns = ['date','active count']) 

各興味のある日付の間にアクティブなお客様の数を見つける良い方法はありますか?今はすべての日程を繰り返していますが、それは私には非常に「ピジョンソニック」な感じはしません。

ご意見やご協力をいただければ幸いです。

答えて

1

一つの方法は、次のようになります。

In [142]: tf = pd.DataFrame({'dates': dates}) 
In [143]: tf['active_count'] = tf['dates'].apply(lambda x: df[(df['startDate']<= x) & (df['endDate']>= x)].count()) 
In [144]: tf 
Out[144]: 
     dates active_count 
0 2016-01-31    1 
1 2016-02-29    3 
2 2016-03-31    3 
3 2016-04-30    2 
4 2016-05-31    0 
+0

おかげで - 私も適用を避けることを望んでいた、また遅い建設。可能であればベクトル化する方法を考えようとしています。 – flyingmeatball

関連する問題