2014-03-02 116 views
35

我想從'B'中的日期中減去'A'中的日期,並添加一個包含差異的新列。在DataFrame pandas中添加日期與日期之間的天數列

df 
      A  B 
one 2014-01-01 2014-02-28 
two 2014-02-03 2014-03-01 

我試過以下,但得到一個錯誤,當我嘗試這包括在for循環中...

import datetime 
date1=df['A'][0] 
date2=df['B'][0] 
mdate1 = datetime.datetime.strptime(date1, "%Y-%m-%d").date() 
rdate1 = datetime.datetime.strptime(date2, "%Y-%m-%d").date() 
delta = (mdate1 - rdate1).days 
print delta 

我應該怎麼辦?

回答

43

假設這些都是datetime列(如果他們不適用to_datetime),你只需將它們相減:

df['A'] = pd.to_datetime(df['A']) 
df['B'] = pd.to_datetime(df['B']) 

In [11]: df.dtypes # if already datetime64 you don't need to use to_datetime 
Out[11]: 
A datetime64[ns] 
B datetime64[ns] 
dtype: object 

In [12]: df['A'] - df['B'] 
Out[12]: 
one -58 days 
two -26 days 
dtype: timedelta64[ns] 

In [13]: df['C'] = df['A'] - df['B'] 

In [14]: df 
Out[14]: 
      A   B  C 
one 2014-01-01 2014-02-28 -58 days 
two 2014-02-03 2014-03-01 -26 days 

注:確保您使用的是新的熊貓(如0.13.1)這可能不適用於舊版本。

+9

我們是否可以擺脫結果中的「天」部分,因爲我們只需要查看數值即。在這種情況下-58,-26。 – 0nir

+3

擴展@AndyHayden評論,這有效,但它應該'pd.offsets.Day(1)'(與's')。我也通常否定它,所以你得到'(df ['A'] - df ['B'])/ pd.offsets.Day(-1)' – dirkjot

+6

然而,如果你想在整個系列上做到這一點,需要'(df ['A'] - df ['B'])/ np.timedelta64(-1,'D')'因爲我不完全理解的原因。 – dirkjot

8

列表解析是最Python的你最好的選擇,最快的方式做到這一點:

[int(i.days) for i in (df.B - df.A)] 
  1. 我將返回timedelta(如「-58天)
  2. i.days會將此值作爲長整型值返回(例如-58L)
  3. int(i.days)會給你-58你尋求的。

如果您的列不是日期時間格式。語法短會:df.A = pd.to_datetime(df.A)

1

如何:

times['days_since'] = max(list(df.index.values)) 
times['days_since'] = times['days_since'] - times['months'] 
times