Python 如何使用Pandas将第二天的日期设置为低于现有日期值
我的Python 如何使用Pandas将第二天的日期设置为低于现有日期值,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我的df看起来像这样。这是一个每日数据集,除了周六: time 2019-01-04 2019-01-01 2019-01-07 2019-01-03 .... 我想做的是找到第二天的日期,并将其放在每个时间值下方,除了周六。如果下一个数据是星期六,则跳过它 我们应该保留原始值,以及值的顺序 如果不是Saturday并且原始next value是下一个日期本身,我们应该只添加一个新的日期value 新的df如下所示: time 2019-01-04 2019
df
看起来像这样。这是一个每日
数据集
,除了周六
:
time
2019-01-04
2019-01-01
2019-01-07
2019-01-03
....
我想做的是找到第二天的日期
,并将其放在每个时间
值下方,除了周六
。如果下一个数据是星期六,则跳过它
我们应该保留原始值
,以及值的顺序
如果不是Saturday
并且原始next value
是下一个日期本身,我们应该只添加一个新的日期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
....
for index, date in df.iterrows():
temp_day = row['Date'] if (row['Date'] + timedelta(days=1)).weekday() != 5 else None
if(temp_day):
temp_df = pd.DataFrame({'Date': temp_day}, index=index+1)
df = pd.concat(df.iloc[:index], temp_df, df.iloc[index+1:], ignore_index=True).reset_index(drop=True)
请注意,我们没有将2017-01-05
放在2017-01-04
之后,因为2017-01-05
是Saturday
,所以我们将2017-01-06
。另外,请注意,2019-01-03
之后的值是2019-01-04
,因为2019-01-03
是原始日期,2019-01-04
是下一个日期
我们保留订单,不删除重复项
我做了什么?
通过这样做,我找到了跳过星期六的方法:
df[df.index.dayofweek != 5]
但是我不知道如何找到第二天的
,如果是星期六的话就跳过。能否请您提供帮助?请按问题更新以下修改和评论。
输出:
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]
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]
您可以使用loc with lambda函数和dt访问器来尝试类似的操作:
pd.concat([df['time'],
(df['time'] + pd.Timedelta(days=1)).loc[lambda x: x.dt.dayofweek!=5]])\
.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]
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]
我还没有测试过,但你可以这样做:
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
....
for index, date in df.iterrows():
temp_day = row['Date'] if (row['Date'] + timedelta(days=1)).weekday() != 5 else None
if(temp_day):
temp_df = pd.DataFrame({'Date': temp_day}, index=index+1)
df = pd.concat(df.iloc[:index], temp_df, df.iloc[index+1:], ignore_index=True).reset_index(drop=True)
你基本上迭代每个索引,得到日期并加上一天,如果不等于星期六,就保留它
然后,通过切片,您可以在当前索引的后面找到新行我们不应该对值进行排序并保留原始值。预期的唯一变化是,如果不是星期六,则新日期将低于当前日期值,如果实际上不是第二天,则更新问题以获得更好的清晰度这非常接近。唯一缺少的是星期六之后的日期。如果第二天是星期六
,则它似乎没有放置任何日期。如果下一个日期是周六
,那么我们将周日
日期
@牙线添加到顶部解决方案1-04中的更新中,1-6是下一个。我不确定您所说的顶部解决方案1-04和1-6是下一个
是什么意思,使用np.where在粗体“更新每…”下方。有一个日期是01-04,下一个日期是01-06。。。跳过周六。