在 DataFrame 熊猫中添加具有日期间隔天数的列

我想从‘ B’中的日期中减去‘ A’中的日期,然后添加一个带有差异的新列。

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

我该怎么办?

282720 次浏览

假设这些是日期时间列(如果它们不应用 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) ,这可能不适用于旧版本。

一个列表内涵是你最好的选择,最 Python 化(也是最快的)的方法:

[int(i.days) for i in (df.B - df.A)]
  1. 我会返回时间差(例如’-58天’)
  2. I.days 将返回一个长整数值(例如 -58L)
  3. Int (i.days)将给出您所寻找的 -58。

如果您的列不是日期时间格式。较短的语法是: df.A = pd.to_datetime(df.A)

这样吧:

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

要删除“ days”文本元素,还可以使用 dt ()访问器访问级数: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.dt.html

那么,

df[['A','B']] = df[['A','B']].apply(pd.to_datetime) #if conversion required
df['C'] = (df['B'] - df['A']).dt.days

返回:

             A          B   C
one 2014-01-01 2014-02-28  58
two 2014-02-03 2014-03-01  26