Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用Pandas将第二天的日期设置为低于现有日期值_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

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。。。跳过周六。