微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐