python - 如何使用 Pandas 将第二天日期置于现有日期值之下

标签 python python-3.x pandas dataframe

我的 df 看起来像这样。这是一个每日数据集星期六除外:

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

我想要做的是找到第二天的 date 并将其放在除 Saturday 之外的每个 time 值下方。如果下一个数据是星期六,则跳过它。

我们应该保留原始值 以及值的顺序

如果不是星期六并且原始下一个值是下一个日期本身,我们应该只添加一个新的日期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-05星期六 所以我们放 2017-01-06。另请注意,2019-01-03 之后的值为 2019-01-04,因为 2019-01-03 是原始日期并且2019-01-04 是下一个日期

我们保留顺序并且不删除重复项。

我做了什么?

我想出了如何跳过 Saturday 的方法:

df[df.index.dayofweek != 5]

但我不知道如何找到下一天,如果是星期六则跳过。你能帮忙吗?

最佳答案

根据问题修改和评论更新。

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 函数的 loc 和 dt 访问器来尝试这样的事情:

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]

关于python - 如何使用 Pandas 将第二天日期置于现有日期值之下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57364273/

相关文章:

python - 为什么这个Python函数在for循环中运行时跳过索引1到3而不迭代索引2

python - 尝试通过python直播YouTube

python - 如何将字典中的值与字符串中的多个元素相加?

python - 在 Pandas 中写入文件的问题

python - 如何在 Pandas Python 中按 id 对行进行排名

python - 检查 Pandas 数据框是否已传递给函数

python - SWIG:结构中的自定义类型和 python 中的赋值

python - 我应该装饰一个函数吗?

python - 如何使用类型提示指定 "nullable"返回类型

python - 在 QMenu 中一次可检查一个 QAction