带有日期列的 DF 在当前和下一行的日期之间添加持续时间列



假设我有一个日期:

date          quantity
2015-01-01    100
2016-01-01    500
2016-01-05    100

,我想添加另一列新列,介绍当前行的日期和下一行日期之间的时间。如果最后一行,请参阅今天的日期。

date          quantity    days
2015-01-01    100         365
2016-01-01    500         4
2016-01-05    100         1227

注意:1227是2016-01-05到2019-05-16(今日(的天数。我可以通过循环进行操作,只是想知道我是否可以使用熊猫干净地做。

如果我们将其推入单行

df['New']=df.date.append(pd.Series(pd.datetime.now())).diff().dropna().dt.days.values
df
Out[102]: 
        date  quantity   New
0 2015-01-01       100   365
1 2016-01-01       500     4
2 2016-01-05       100  1226

您可以在结果上移动并使用DT访问者:

In [11]: df.date - df.date.shift()
Out[11]:
0        NaT
1   365 days
2     4 days
Name: date, dtype: timedelta64[ns]
In [12]: (df.date - df.date.shift()).dt.days
Out[12]:
0      NaN
1    365.0
2      4.0
Name: date, dtype: float64
In [13]: (df.date - df.date.shift()).dt.days.fillna(0)
Out[13]:
0      0.0
1    365.0
2      4.0
Name: date, dtype: float64

向上移动以获得所需的相同结果:

In [14]: (df.date.shift(-1) - df.date).dt.days.fillna(0)
Out[14]:
0    365.0
1      4.0
2      0.0
Name: date, dtype: float64

如评论时,您可以使用diff进行此清洁程序:

In [21]: -df.date.diff(-1).fillna(0)
Out[21]:
0   365 days
1     4 days
2     0 days
Name: date, dtype: timedelta64[ns]
In [22]: -df.date.diff(-1).fillna(0).dt.days
Out[22]:
0    365
1      4
2      0
Name: date, dtype: int64

查找差异和填充,

df.loc[:, 'diff'] = np.abs(df.date-df.date.shift(-1)).dt.days
df['diff'] = df['diff'].fillna(np.abs(df.date-pd.Timestamp.now()).dt.days)

    date        quantity    diff
0   2015-01-01  100         365.0
1   2016-01-01  500         4.0
2   2016-01-05  100         1226.0

最新更新