Name Date
Person A 2019-06-18
Person A 2019-05-14
Person A 2019-04-03
Person B 2019-05-19
Person C 2019-05-16
Person C 2019-05-23
Person C 2019-05-15
Person D 2019-06-21
我想要做的是修改5/14到6/14之间的任何人的日期并减去7天.如果在此操作完成后,它们仍然在该范围内,则再减去7天.
最后,我希望数据看起来像这样:
Name Date
Person A 2019-06-18
Person A 2019-05-07
Person A 2019-04-03
Person B 2019-05-12
Person C 2019-05-09
Person C 2019-05-09
Person C 2019-05-08
Person D 2019-06-21
(在这一步之后,我会把它卷起来,以便每个人都有一行包含他们所有的日期,然后向他们发送他们的信息 – 但我想我可以自己解决这个问题.)
df = df[(df['Date'] >= '2019-05-14') & (df['Date'] <= '2019-06-14')]
df['Date'] = df['Date'] - pd.timedelta(days=7)
但是,我不知道如何循环它,我也不知道如何应用它而不会丢失我的原始数据.
因此,我的代码产生了这个框架:
Name Date
Person A 2019-05-07
Person B 2019-05-12
Person C 2019-05-16
Person C 2019-05-08
解决方法:
我假设Date列是datetime64类型.
最初的步骤是定义“边界日期”:
start_date = pd.to_datetime('2019-05-14')
end_date = pd.to_datetime('2019-06-14')
然后我们必须定义要应用于每个日期的函数:
def fn(dat):
inRng = (dat >= start_date) & (dat <= end_date)
dat2 = dat
if inRng:
diffWeeks = int((dat - start_date) / np.timedelta64(1, 'W')) + 1
dat2 -= np.timedelta64(diffWeeks, 'W')
return dat2
最后一步是应用此功能.
为了便于比较源数据和结果,我决定替换
新列(Dat2)中的结果:
df['Dat2'] = df.Date.apply(fn)
当您打印DataFrame时,您将获得:
Name Date Dat2
0 Person A 2019-06-18 2019-06-18
1 Person A 2019-05-14 2019-05-07
2 Person A 2019-04-03 2019-04-03
3 Person B 2019-05-19 2019-05-12
4 Person C 2019-05-16 2019-05-09
5 Person C 2019-05-23 2019-05-09
6 Person C 2019-05-15 2019-05-08
7 Person D 2019-06-21 2019-06-21