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日的订单除以订单定义
例如,对于DT2019年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好的,我会这样做..我会填几行,因为我必须手动完成