首页 > 解决方案 > 如何使用 Pandas 将第二天日期低于现有日期值

问题描述

我的df样子是这样的。它是一个daily dataset除了Saturday

time    
2019-01-04       
2019-01-01  
2019-01-07 
2019-01-03 
....

我想做的是找到第二天date并将其放在每个time值下方,除了Saturday. 如果下一个数据是Saturday然后跳过它。

我们应该保留original value这些order价值观。

我们应该只添加一个新的日期value,如果它不是Saturday,如果原来next value是下一个日期本身。

新的df看起来像这样:

time   
2019-01-04
2019-01-06       
2019-01-01
2019-01-02   
2019-01-07
2019-01-08 
2019-01-03
2019-01-04
....

请注意,我们没有放2017-01-05后,2017-01-04因为2017-01-05Saturday所以我们放2017-01-06。另外,请注意 after 的值2019-01-032019-01-04因为2019-01-03是原始日期并且2019-01-04是 next date

我们保留订单,不会删除重复的。

我做了什么?

我想出了如何Saturday通过这样做跳过:

df[df.index.dayofweek != 5]

但我不知道如何找到next day并跳过它Saturday。能否请你帮忙?

标签: pythonpython-3.xpandasdataframe

解决方案


更新每个问题修改和下面的评论。

new_days = pd.Series(np.where(df['time'].dt.dayofweek != 4, 
                              df['time'] + pd.Timedelta(days=1), 
                              df['time'] + pd.Timedelta(days=2)), 
                     name='time')

pd.concat([df['time'], new_days]).sort_index()

输出:

0   2019-01-04
0   2019-01-06
1   2019-01-01
1   2019-01-02
2   2019-01-07
2   2019-01-08
3   2019-01-03
3   2019-01-04
Name: time, dtype: datetime64[ns]

您可以使用带有 lambda 函数和 dt 访问器的 loc 来尝试这样的事情:

pd.concat([df['time'], 
           (df['time'] + pd.Timedelta(days=1)).loc[lambda x: x.dt.dayofweek!=5]])\
  .sort_index()

输出:

0   2019-01-04
1   2019-01-01
1   2019-01-02
2   2019-01-07
2   2019-01-08
3   2019-01-03
3   2019-01-04
Name: time, dtype: datetime64[ns]

推荐阅读