我有一个包含两列的数据框。一个是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很棒,但是熊猫也可以。
答案 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 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