python – Pandas逐步减去日期,直到数据帧满足条件

我有一个如下所示的数据框:

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

相关文章

转载:一文讲述Pandas库的数据读取、数据获取、数据拼接、数...
Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基...
整体流程登录天池在线编程环境导入pandas和xrld操作EXCEL文件...
 一、numpy小结             二、pandas2.1为...
1、时间偏移DateOffset对象DateOffset类似于时间差Timedelta...
1、pandas内置样式空值高亮highlight_null最大最小值高亮背景...