Python 从循环中的一周中减去datetime

Python 从循环中的一周中减去datetime,python,pandas,Python,Pandas,我有如下数据: DT DOW C O 3/16/2019 6 B 100 3/17/2019 0 B 218 3/18/2019 1 B 124 3/19/2019 2 B 130 3/20/2019 3 B 137 3/21/2019 4 B 165 3/22/2019 5 B 153 3/23/2019 6 B 197 3/24/2019 0 B 225 3/2

我有如下数据:

DT         DOW  C    O
3/16/2019   6   B   100
3/17/2019   0   B   218
3/18/2019   1   B   124
3/19/2019   2   B   130
3/20/2019   3   B   137
3/21/2019   4   B   165
3/22/2019   5   B   153
3/23/2019   6   B   197
3/24/2019   0   B   225
3/25/2019   1   B   133
现在我想添加一个新的列
“增长”
,它由对应于2019年3月16日至2019年3月22日的订单除以订单定义

例如,对于DT
2019年03月24日
而言,对应的DT为
2019年03月17日
,因为两者都是周一。所以答案是225-218/225=0.03。同样,对于
2019年3月25日
而言,要减去的日期为
2019年3月18日

注:我们仅从2019年3月16日<代码>到2019年3月22日<代码>的一周中减去


请注意,DT列的日期为5月份,增长列的日期为2019年3月16日至2019年3月22日为空。它将从2019年3月23日开始。

如果所有日期时间都是连续的,则首先将删除的重复项创建的值减去,然后除以列
O
,所有行都先省略-因此分配给
df.loc[掩码,'new']

df['DT'] = pd.to_datetime(df['DT'])

mask = df.duplicated('DOW')
s = df['DOW'].map(df[~mask].set_index('DOW')['O'])
df.loc[mask, 'new'] = df['O'].sub(s).div(df['O'])

print (df)
          DT  DOW  C    O       new
0 2019-03-16    6  B  100       NaN
1 2019-03-17    0  B  218       NaN
2 2019-03-18    1  B  124       NaN
3 2019-03-19    2  B  130       NaN
4 2019-03-20    3  B  137       NaN
5 2019-03-21    4  B  165       NaN
6 2019-03-22    5  B  153       NaN
7 2019-03-23    6  B  197  0.492386
8 2019-03-24    0  B  225  0.031111
9 2019-03-25    1  B  133  0.067669
你可以试试这个:

>>> df
DT         DOW  C    O
3/16/2019   6   B   100
3/17/2019   0   B   218
3/18/2019   1   B   124
3/19/2019   2   B   130
3/20/2019   3   B   137
3/21/2019   4   B   165
3/22/2019   5   B   153
3/23/2019   6   B   197
3/24/2019   0   B   225
3/25/2019   1   B   133
>>> df.index = pd.to_datetime(df.DT)
>>> df
                   DT  DOW  C    O
DT                                
2019-03-16  3/16/2019    6  B  100
2019-03-17  3/17/2019    0  B  218
2019-03-18  3/18/2019    1  B  124
2019-03-19  3/19/2019    2  B  130
2019-03-20  3/20/2019    3  B  137
2019-03-21  3/21/2019    4  B  165
2019-03-22  3/22/2019    5  B  153
2019-03-23  3/23/2019    6  B  197
2019-03-24  3/24/2019    0  B  225
2019-03-25  3/25/2019    1  B  133
>>> df['O'].rolling('7d', min_periods = 8, closed='both'
                    ).apply(lambda x:(x[-1] - x[0])/x[-1], 
                                      raw = False)
DT
2019-03-16         NaN
2019-03-17         NaN
2019-03-18         NaN
2019-03-19         NaN
2019-03-20         NaN
2019-03-21         NaN
2019-03-22         NaN
2019-03-23    0.492386
2019-03-24    0.031111
2019-03-25    0.067669
Name: O, dtype: float64

@UbuntuNoob-好的,你能添加预期的输出吗?@UbuntuNoob-从样本数据看新的列怎么样?因为它在问题中丢失了…@ubuntu_noob-或者你需要
df['new']=df.groupby('DOW')['O'].pct_change()
?例如,我尝试了一个日期2019年10月4日,O是166,而道琼斯指数是3,所以2019年3月16日到2019年3月22日这一周的对应日期是2019-03-20,所以答案应该是166(根据我的数据)-137/166=0.17,但答案是生成的代码为0.03好的,我会这样做..我会填几行,因为我必须手动完成