2017-02-22 8 views
0

У меня есть набор данных, как это:Strptime возвращаются все строки панды dataframe вместо только один ряд

Policy | Customer | Employee | CoveredDate | LapseDate 
123 | 1234  | 1234  | 2011-06-01 | 2013-01-01 
124 | 1234  | 1234  | 2016-01-01 | 2013-01-01 
124 | 5678  | 5555  | 2014-01-01 | 2013-01-01 

Я пытаюсь перебирать каждую политику для каждого сотрудника каждого клиента (клиент может иметь много сотрудники, сотрудник может иметь несколько политик) и сравнить приведенную дату с датой истечения срока действия конкретного сотрудника. Если закрытая дата и дата простоя не превышают 5 дней, я хотел бы добавить эту политику в список результатов.

До сих пор я использовал этот код:

import pandas 
import datetime 

wd = pandas.read_csv(<<FILE LOCATION>>) 

Resultlist=[] 
for Customer in wd.groupby(['Employee', 'Customer']): 
    for Policy in wd.groupby(['Employee', 'Customer']): 
     EffDate = datetime.datetime.strptime(str(wd['CoveredDate']),'%Y-%m-%d') 
     for Policy in wd.groupby(['Employee', 'Customer']): 
      lapsedate = datetime.datetime.strptime(str(wd['LapseDate']),'%Y-%m-%d') + datetime.timedelta(days=5) 
      if effdate < LapseDate: 
       Resultlist.append(wd['Policy','Customer']) 

я в конечном итоге получаю сообщение об ошибке, когда функция strptime берет каждый строки моего dataframe в качестве входных данных, вместо того, чтобы сосредоточить внимание на итерация это в данный момент - это для моего примера выше, я хотел бы получить:

ValueError: time data '0 2011-06-01\n1 2016-01-01\n2 2014-01-01\nName: 

CoverageEffDate, DTYPE: объект»не соответствует формату '% Y-% m-% d'

Я не совсем уверен, почему он пытается задействовать каждый объект, поскольку я следил за форматом нескольких других ответов на SE, подробно описывающих, как итерации через кадр данных pandas - я был бы очень признателен, если кто-то может мне помочь это!

+0

Вы можете поделиться ожидаемой продукцией? – Shijo

ответ

2

IIUC вы хотите, чтобы все записи, где wd ['LapseDate'] & wd ['CoveredDate'] находятся в течение 5 дней.

Использование pd.to_datetime для преобразования форматов даты времени

wd['LapseDate'] = pd.to_datetime(wd.LapseDate) 
wd['CoveredDate'] = pd.to_datetime(wd.CoveredDate) 
wd['diff'] = ((wd['LapseDate']-wd['CoveredDate']).dt.days).abs() 
print wd[(wd['diff']<366)] # change 365 to 5 

Входной

Policy Customer Employee CoveredDate LapseDate diff 
0  123  1234  1234 2011-06-01 2013-01-01 580 
1  124  1234  1234 2016-01-01 2013-01-01 1095 
2  124  5678  5555 2014-01-01 2013-01-01 365 

выходные - Здесь я фильтруется для дифф меньше, чем 366, изменить что 5

Policy Customer Employee CoveredDate LapseDate diff 
2  124  5678  5555 2014-01-01 2013-01-01 365 
+0

Спасибо, это помогает! Я должен был расширить свою цель - я действительно хочу сравнить каждую охватываемую дату с каждой другой датой истечения срока действия номера сотрудника - чтобы вы сравнивали политики 123 и 124. Если разница между датой закрытия политики 123 и датой 124-й даты была 5 дней, то я хочу добавить его в список. Тем не менее, функция pd.to_datetime - это то, что я искал, чтобы решить возникшую у меня ошибку - спасибо! – funkadellicdan