Strptime返回所有Pandas数据行而不是一行

时间:2017-02-22 13:57:14

标签: python pandas datetime 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函数将我的数据帧的每行作为一个输入,而不是只关注它当前所在的迭代 - 所以对于我上面的例子,我会得到:

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

CoverageEffDate,dtype:object'与格式'%Y-%m-%d'不匹配

我不完全确定为什么它会试图引入每个对象,因为我已经按照SE上的一些其他答案的格式详细说明如何迭代一个pandas数据帧 - 如果有人可以帮助我,我将非常感激想出来了!

1 个答案:

答案 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