python - 如何使用 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-05
是Saturday
所以我们放2017-01-06
。另外,请注意 after 的值2019-01-03
是2019-01-04
因为2019-01-03
是原始日期并且2019-01-04
是 next date
。
我们保留订单,不会删除重复的。
我做了什么?
我想出了如何Saturday
通过这样做跳过:
df[df.index.dayofweek != 5]
但我不知道如何找到next day
并跳过它Saturday
。能否请你帮忙?
解决方案
更新每个问题修改和下面的评论。
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]
推荐阅读
- ffmpeg - ffmpeg mp4 到 hls 限制输出块大小而不是持续时间
- c# - 选择 DropDownList1 值时,DropDownList2 中的重复值存储
- php - 如何在 PHP 中使用 mysql 表中的变量
- javascript - PHP中带有提交按钮的未定义索引
- python - 如何从元组中排除字符串以仅显示整数值?
- metal - 颜色的金属 Alpha 值不变
- php - 在 PHP 中使用更短的代码验证多个输入
- python - 重采样后合并熊猫数据框
- c# - WPF 用户控件未在 WinForms 用户控件中正确加载
- mysql - 多个mysql连接使用大量内存