检查python日期列表中的任何日期是否在两个日期列之间

时间:2019-07-11 15:43:12

标签: python pandas date pyspark

我有一个包含两列的数据框。一个是START_DATE,一个是END_DATE。我也有日期的python列表。我想要数据框中的第三列,以指示我的python列表中的任何日期是否在每个特定行的数据框中的START_DATE和END_DATE之间。如果日期列表中有一个介于START_DATE和END_DATE之间的日期,则第三列应显示为true。

dates_list = ['2019-01-06', '2019-04-08']

START_DATE|END_DATE|
____________________
2019-01-01|2019-01-12
2019-01-03|2019-01-05
2019-04-03|2019-04-09

我要显示第三列

TRUE
FALSE
TRUE

拥有pyspark很棒,但是熊猫也可以。

4 个答案:

答案 0 :(得分:1)

尝试使用pd.date_range和设置日期检查的相交技术是否存在

df = pd.DataFrame(data={"start_date":["2019-01-01","2019-01-03","2019-04-03"],
                       "end_date":["2019-01-12","2019-01-05","2019-04-09"]})
dates_list = ['2019-01-06', '2019-04-08']
def creating_dates(row,date_list):
    dates = list(pd.date_range(start=row['start_date'], end=row['end_date']).astype(str))
    res = set(dates).intersection(set(date_list))
    if res:
        return True
    return False
df['check_exist'] = df.apply(lambda x:creating_dates(x,dates_list),axis=1)

   start_date   end_date    check_exist
0   2019-01-01  2019-01-12  True
1   2019-01-03  2019-01-05  False
2   2019-04-03  2019-04-09  True

答案 1 :(得分:1)

可以使用pd.IntervalIndex完成此操作。首先将所有日期转换为日期时间:

from datetime import datetime
df = df.apply(pd.to_datetime)
dates = [datetime.strptime(x, '%Y-%m-%d') for x in dates_list]

现在,让我们使用其from_arrays方法构建一个pd.IntervalIndex,并使用列表理解来检查列表中包含any日期的时间间隔:

ix = pd.IntervalIndex.from_arrays(df['START_DATE'],df['END_DATE'],closed='both')
[any(date in i for date in dates) for i in ix]
# [True, False, True]

答案 2 :(得分:1)

在您标记为 pyspark 的情况下,您可以尝试pyspark.sql.DataFrame.join

设置

StreamTransformation<T>

加入(left_semi,left_anti),然后加入联盟

使用left_semi Join获取所有匹配的行,并使用left_anti JOIN获取所有不匹配的行,标记这些行,然后合并结果

0

答案 3 :(得分:0)

我在python上还比较陌生,但认为我会去:)

希望有帮助!

代码

import pandas as pd
import numpy as np
from datetime import datetime

dict = {'START_DATE':['2019-01-01','2019-01-03','2019-04-03'],
        'END_DATE': ['2019-01-12','2019-01-05','2019-04-09'],
        'RESULT':['FALSE','FALSE','FALSE']}


dates_list = ['2019-01-06', '2019-04-08']

df = pd.DataFrame(dict)

print('BEFORE')
print(df)


for row in df.itertuples():

    start_date = datetime.fromisoformat(df.at[row.Index, 'START_DATE'])
    end_date = datetime.fromisoformat(df.at[row.Index, 'END_DATE'])     
    result = 'false'

    for datestr in dates_list:
        date = datetime.fromisoformat(datestr)

        if start_date <= date <= end_date:
            result = 'TRUE'
            df.at[row.Index, 'RESULT'] = result


print('AFTER')
print(df)

会给你

输出

BEFORE
   START_DATE    END_DATE RESULT
0  2019-01-01  2019-01-12  FALSE
1  2019-01-03  2019-01-05  FALSE
2  2019-04-03  2019-04-09  FALSE
AFTER
   START_DATE    END_DATE RESULT
0  2019-01-01  2019-01-12   TRUE
1  2019-01-03  2019-01-05  FALSE
2  2019-04-03  2019-04-09   TRUE