我有一个类似的数据集:
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'])
我最终会遇到一个错误,而我的dataframe的每个行都作为一个输入,而不仅仅是关注当前的迭代 - 因此,对于上面的示例,我会得到:
ValueError: time data '0 2011-06-01n1 2016-01-01n2 2014-01-01nName:
CoverageFageFate,dtype:对象'不匹配格式'%y-%m-%d'
我不确定为什么它试图吸引每个对象,因为我遵循了其他一些答案的格式,详细介绍了如何通过pandas dataframe迭代 - 如果有人可以帮助我,我非常感谢弄清楚!
iiuc您需要所有记录,其中wd ['lapsedate']&amp;wd ['coveddate']在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的diff,将其更改为5
Policy Customer Employee CoveredDate LapseDate diff
2 124 5678 5555 2014-01-01 2013-01-01 365