Python 创建pd.date\u范围的列
我有这样的数据:Python 创建pd.date\u范围的列,python,pandas,Python,Pandas,我有这样的数据: import datetime as dt import pandas as pd df = pd.DataFrame({'date':[dt.datetime(2018,8,25), dt.datetime(2018,7,21)], 'n':[10,7]}) 我想创建第三列,其中包含由pd.date\u range创建的日期范围,使用“date”作为开始日期,“n”作为期间数。 因此,第一个条目应该是: pd.date_range(dt
import datetime as dt
import pandas as pd
df = pd.DataFrame({'date':[dt.datetime(2018,8,25), dt.datetime(2018,7,21)],
'n':[10,7]})
我想创建第三列,其中包含由pd.date\u range创建的日期范围,使用“date”作为开始日期,“n”作为期间数。
因此,第一个条目应该是:
pd.date_range(dt.datetime(2018,8,25), periods=10, freq='d')
(我有一个“目标”日期列表,我的目标是检查date_范围是否包含任何这些目标日期)
我试过这个:
df['date_range'] = df.apply(lambda x: pd.date_range(x['date'],
x['n'],
freq='d'))
但这给出了一个关键错误:('date','occurrentedatindex date')
您知道如何在不使用for循环的情况下执行此操作,或者有更好的解决方案吗?您应该在
apply
中添加axis=1
df['date_range'] = df.apply(lambda x: pd.date_range(x['date'], x['n'], freq='d'), axis=1)
我想出了一个有效的解决方案(但我相信有更好的方法…)
您可以在不创建日期范围或日期列的情况下解决问题。要检查tgt中的目标日期是否属于df行指定的日期范围,可以计算日期范围的结束,然后检查tgt中的每个日期是否在时间间隔的开始和结束之间。下面的代码实现了这一点,并生成与您自己的答案中相同的“target_date”列:
df = pd.DataFrame({'date':[dt.datetime(2018,8,25), dt.datetime(2018,7,21)],
'n':[10,7]})
df["daterange_end"] = df.apply(lambda x: x["date"] + pd.Timedelta(days=x["n"]), axis=1)
tgt = [dt.datetime(2018,8,26)]
df['target_date'] = 0
df.loc[(tgt[0] > df.date) &(tgt[0] < df.daterange_end),"target_date"] = 1
print(df)
# date n daterange_end target_date
# 0 2018-08-25 10 2018-09-04 1
# 1 2018-07-21 7 2018-07-28 0
df=pd.DataFrame({'date':[dt.datetime(2018,8,25),dt.datetime(2018,7,21)],
‘n’:[10,7]})
df[“daterange_end”]=df.apply(λx:x[“date”]+pd.Timedelta(天=x[“n”]),轴=1)
tgt=[dt.日期时间(2018,8,26)]
df['target_date']=0
df.loc[(tgt[0]>df.date)和(tgt[0]
这会引发ValueError:值的长度与索引的长度不匹配,因此您需要在pd.date\u range()中添加“start=”和“periods=”以及apply()中的axis=1,如下所示:df['date\u range']=df.apply(lambda x:pd.date\u range(start=x['date'],periods=x['n'],freq='d'),axis=1)
df = pd.DataFrame({'date':[dt.datetime(2018,8,25), dt.datetime(2018,7,21)],
'n':[10,7]})
df["daterange_end"] = df.apply(lambda x: x["date"] + pd.Timedelta(days=x["n"]), axis=1)
tgt = [dt.datetime(2018,8,26)]
df['target_date'] = 0
df.loc[(tgt[0] > df.date) &(tgt[0] < df.daterange_end),"target_date"] = 1
print(df)
# date n daterange_end target_date
# 0 2018-08-25 10 2018-09-04 1
# 1 2018-07-21 7 2018-07-28 0