我有这样的数据集:
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函数将我的数据帧的每行作为一个输入,而不是只关注它当前所在的迭代 - 所以对于我上面的例子,我会得到:
ValueError: time data '0 2011-06-01\n1 2016-01-01\n2 2014-01-01\nName:
CoverageEffDate,dtype:object'与格式'%Y-%m-%d'不匹配
我不完全确定为什么它会试图引入每个对象,因为我已经按照SE上的一些其他答案的格式详细说明如何迭代一个pandas数据帧 - 如果有人可以帮助我,我将非常感激想出来了!
答案 0 :(得分:2)
IIUC你想要所有记录,其中wd [&#39; LapseDate&#39;]&amp; wd [&#39; CoveredDate&#39;]在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