Python 查找数据帧中两列之间的时间差

Python 查找数据帧中两列之间的时间差,python,python-2.7,pandas,Python,Python 2.7,Pandas,我试图找出以下帧的两列之间的时间差: 测试日期|测试类型|首次使用日期 我使用了以下函数定义来获得差异: def days_between(d1, d2): d1 = datetime.strptime(d1, "%Y-%m-%d") d2 = datetime.strptime(d2, "%Y-%m-%d") return abs((d2 - d1).days) 它工作得很好,但是它不接受一个系列作为输入。所以我必须构建一个for循环,在索引上循环: age_veh

我试图找出以下帧的两列之间的时间差:

测试日期|测试类型|首次使用日期


我使用了以下函数定义来获得差异:

def days_between(d1, d2):
    d1 = datetime.strptime(d1, "%Y-%m-%d")
    d2 = datetime.strptime(d2, "%Y-%m-%d")
    return abs((d2 - d1).days)
它工作得很好,但是它不接受一个系列作为输入。所以我必须构建一个for循环,在索引上循环:

age_veh = []
for i in range(0, len(data_manufacturer)-1):
    age_veh[i].append(days_between(data_manufacturer.iloc[i,0], data_manufacturer.iloc[i,4]))
但是,它确实返回一个错误: 索引器:列表索引超出范围


我不知道这是否是正确的做法,我做错了什么,或者一个替代的解决方案将非常感激。请记住,我有大约200万行。

IIUC您可以先转换列,使用,然后将
timedelta
转换为
days

print df
  id  value      date1      date2  sum
0  A    150 2014-04-08 2014-03-08  NaN
1  B    100 2014-05-08 2014-02-08  NaN
2  B    200 2014-01-08 2014-07-08  100
3  A    200 2014-04-08 2014-03-08  NaN
4  A    300 2014-06-08 2014-04-08  350

df['date1'] =  pd.to_datetime(df['date1'])
df['date2'] =  pd.to_datetime(df['date2'])

df['diff'] = (df['date1'] - df['date2']).abs()  / np.timedelta64(1, 'D')
print df
  id  value      date1      date2  sum  diff
0  A    150 2014-04-08 2014-03-08  NaN    31
1  B    100 2014-05-08 2014-02-08  NaN    89
2  B    200 2014-01-08 2014-07-08  100   181
3  A    200 2014-04-08 2014-03-08  NaN    31
4  A    300 2014-06-08 2014-04-08  350    61
编辑

In [174]: %timeit (df['Test Date'] - df['First Use Date']).abs().dt.days
10 loops, best of 3: 38.8 ms per loop

In [175]: %timeit (df['Test Date'] - df['First Use Date']).abs()  / np.timedelta64(1, 'D')
1000 loops, best of 3: 1.62 ms per loop
我认为在较大的
数据帧中将
np.timedelta64(1,'D')
转换为
days
更好,因为它更快:

我使用EdChum,仅
len(df)=4k

import io
import pandas as pd
import numpy as np

t=u"""Test Date,Test Type,First Use Date
2011-02-05,A,2010-01-05
2012-02-05,A,2010-03-05
2013-02-05,A,2010-06-05
2014-02-05,A,2010-08-05"""

df = pd.read_csv(io.StringIO(t))

df =  pd.concat([df]*1000).reset_index(drop=True)

df['Test Date'] = pd.to_datetime(df['Test Date'])
df['First Use Date'] = pd.to_datetime(df['First Use Date'])

print (df['Test Date'] - df['First Use Date']).abs().dt.days

print (df['Test Date'] - df['First Use Date']).abs()  / np.timedelta64(1, 'D')
计时

In [174]: %timeit (df['Test Date'] - df['First Use Date']).abs().dt.days
10 loops, best of 3: 38.8 ms per loop

In [175]: %timeit (df['Test Date'] - df['First Use Date']).abs()  / np.timedelta64(1, 'D')
1000 loops, best of 3: 1.62 ms per loop
使用转换列,然后可以减去列以生成值上的
timedelta
,然后可以调用以获取总天数,例如:

In [119]:
import io
import pandas as pd
t="""Test Date,Test Type,First Use Date
2011-02-05,A,2010-01-05
2012-02-05,A,2010-03-05
2013-02-05,A,2010-06-05
2014-02-05,A,2010-08-05"""
df = pd.read_csv(io.StringIO(t))
df
Out[119]:
    Test Date Test Type First Use Date
0  2011-02-05         A     2010-01-05
1  2012-02-05         A     2010-03-05
2  2013-02-05         A     2010-06-05
3  2014-02-05         A     2010-08-05

In [121]:    
df['Test Date'] = pd.to_datetime(df['Test Date'])
df['First Use Date'] = pd.to_datetime(df['First Use Date'])
df.info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 4 entries, 0 to 3
Data columns (total 3 columns):
Test Date         4 non-null datetime64[ns]
Test Type         4 non-null object
First Use Date    4 non-null datetime64[ns]
dtypes: datetime64[ns](2), object(1)
memory usage: 128.0+ bytes

In [122]:
df['days'] = (df['Test Date'] - df['First Use Date']).abs().dt.days
df

Out[122]:
   Test Date Test Type First Use Date  days
0 2011-02-05         A     2010-01-05   396
1 2012-02-05         A     2010-03-05   702
2 2013-02-05         A     2010-06-05   976
3 2014-02-05         A     2010-08-05  1280
[119]中的

输入io
作为pd进口熊猫
t=“”测试日期、测试类型、首次使用日期
2011-02-05,2010-01-05
2012-02-05,2010-03-05
2013-02-05,2010-06-05
2014-02-05,2010-08-05
df=pd.read\U csv(io.StringIO(t))
df
出[119]:
测试日期测试类型首次使用日期
0 2011-02-05 2010-01-05
1 2012-02-05 A 2010-03-05
2 2013-02-05 2010-06-05
3 2014-02-05 2010-08-05
在[121]中:
df[‘测试日期’]=pd.to_datetime(df[‘测试日期’])
df[‘首次使用日期’]=pd.to_datetime(df[‘首次使用日期’])
df.info()
INT64索引:4个条目,0到3
数据列(共3列):
测试日期4非空datetime64[ns]
测试类型4非空对象
首次使用日期4非空datetime64[ns]
数据类型:datetime64[ns](2),对象(1)
内存使用:128.0+字节
在[122]中:
df['days']=(df['Test Date']-df['First Use Date']).abs().dt.days
df
出[122]:
测试日期测试类型首次使用日期天数
0 2011-02-05 A 2010-01-05 396
1 2012-02-05 A 2010-03-05 702
2 2013-02-05 A 2010-06-05 976
3 2014-02-05 A 2010-08-05 1280

为什么不将列转换为datetime,然后减去col
df['Test Date']=pd.to_datetime(df['Test Date']
等等,然后
df['Test Date']-df['First Use Date']
将返回一个应该返回的TimeDelta,谢谢!