在数据帧的同一单元格中使用多个日期计算

2024-10-01 04:53:00 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个如下所示的数据帧

   userid   recorddate              alertdate
0    tom    2018-06-12 00:00:00.0   2018-06-13 00:00:00.0, 2015-04-13 00:00:00.0
1    nick   2019-06-01 00:00:00.0   2019-11-11 00:00:00.0, 2020-02-12 00:00:00.0, 2020-01-10 00:00:00.0
2    bob    2019-06-02 00:00:00.0   2019-06-01 00:00:00.0

我想做的是把“alertdate”列中的日期记下来,看看它们是否在recorddate之前的10天内

在本例中,由于2018-06-13的值,tom会选择

如果alertdate中只有一个日期,我知道如何执行此操作,但在此列中,可能有许多日期由一列分隔

有什么帮助或提示吗?我将创建一个新列,其中包含一个简单的布尔值,用于判断recorddate之后10天内是否存在alertdate。如果可能的话,不要创建新行来分隔日期,因为数据框将包含其他数据列,并且希望防止重复

谢谢


Tags: 数据nickbobuseridtom本例框将recorddate
2条回答

您可以将“alertdate”值转换为具有str.split()的日期列表:

df['alertdate'] = df['alertdate'].str.split(', ')

然后,您可以使用pd.to_datetime()在行和每行的列表元素上循环进行比较

方法:

  1. 我用双空格分隔符读入您的输入
  2. 我用split()将字符串转换为df['alertdate']列中的列表
  3. 我创建了一个名为df['alertdate_lt_10days']的列,该列首先假定为“否”,随后将为相关行返回“是”
  4. 我遍历了列、行和单元格,关键是:
    A.第一个for语句-使用zip()同时循环遍历两列的行和b。第二个for语句-循环alertdate列单元格中的列表,以便能够比较日期,看看它们是否在10天之内
  5. 我将recorddatealertdate字符串转换为日期,然后使用.daystimedelta对象转换为integer(默认情况下,减去日期会创建一个timedelta对象,不能与整数进行比较)
  6. 最后,我使用了非常有用和实用的np.where()为我们先前创建的新列指定了一个“是”

代码:

import pandas as pd
import numpy as np
df=pd.read_clipboard(sep='\s+\s+')

df['alertdate'] = df['alertdate'].apply(lambda x: x.split(','))
df['alertdate_lt_10days'] = 'No'
for recorddate, list_alertdate in zip(df['recorddate'], df['alertdate']):
    for alertdate in list_alertdate:
        if -10 < (pd.to_datetime(alertdate) - pd.to_datetime(recorddate)).days < 10:
            df['alertdate_lt_10days'] = np.where(df['recorddate'] == recorddate, 'Yes', df['alertdate_lt_10days'])
df

输出:

        userid  recorddate                  alertdate             alertdate_lt_10days
0       tom     2018-06-12 00:00:00.0       [2018-06-13 00:00:00.0, 2015-04-13 00:00:00.0]  Yes
1       nick    2019-06-01 00:00:00.0       [2019-11-11 00:00:00.0, 2020-02-12 00:00:00.0...    No
2       bob     2019-06-02 00:00:00.0       [2019-06-01 00:00:00.0]            Yes

相关问题 更多 >