假设我有一个日期:
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