带有日期列的df在当前日期和下一行日期之间添加一个工期列

时间:2019-05-15 17:57:48

标签: python pandas dataframe

假设我有一个日期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(今天)的天数。 我可以使用循环来做,只是想知道我是否可以利用熊猫来干净地做它。

3 个答案:

答案 0 :(得分:2)

如果我们将其压入一行

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

答案 1 :(得分:0)

您可以在结果上移动并使用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

答案 2 :(得分:0)

查找差异和内容,

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