[英]Creating a Pandas dataframe column which is conditional on a function
[英]Creating a column in a pandas dataframe conditional on dates
我目前有一个 dataframe 的客户、合同和合同日期,例如前
Cust Contract Start End
A 123 10/1/2021 11/3/2021
B 987 7/4/2022 8/12/2022
对于每一行,我想生成一个变量,告诉我它在设定范围内是否处于活动状态,例如:10/1/2021-12/31/2021。
当我从 excel 文件导入时,“开始”和“结束”列以 datetime64[ns] 的形式出现
到目前为止我尝试过的代码是这样的:
df.loc[df['Start'].dt.strftime('%Y-%m-%d')<='2021-10-31' & df['End'].dt.strftime('%Y-%m-%d')<='2021-10-1', 'Active Flag'] = 'Yes'
当我运行它时,我收到以下错误
Cannot perform 'rand_' with a dtyped [object] array and scalar of type [bool]
我不确定我是否在正确的轨道上解决这个问题,或者是否有更简单的方法。 任何帮助将不胜感激,因为 Python 的日期时间操作对我来说非常奇怪。
这是一种方法:
# Convert to `datetime` first
df.Start = pd.to_datetime(df.Start, format="%m/%d/%Y")
df.End = pd.to_datetime(df.End, format="%m/%d/%Y")
target = pd.date_range('2021-10-1', '2021-12-31')
df['is_active'] = df.Start.isin(target) | df.End.isin(target)
Output:
Out[17]:
Cust Contract Start End is_active
0 A 123 2021-10-01 2021-11-03 True
1 B 987 2022-07-04 2022-08-12 False
我们可以使用简单的日期比较来解决这个问题。
这些合同可能有两种情况:
start_range = pd.to_datetime('10/1/2021')
end_range = pd.to_datetime('31/12/2021')
# --- Start Date --- --- End Date ---
df['Active_Only_in_Range'] = (df.Start >= start_range) & (df.End <= end_range)
df['Active_Only_in_Range_Flag'] = np.where(df.Active_Only_in_Range,'Yes','No')
start_range = pd.to_datetime('10/1/2021')
end_range = pd.to_datetime('31/12/2021')
# ----------- Start Date ------------ ----------- End Date ------------
df['Partial_Active'] = ((df.Start >= start_range) & (df.Start <= end_range)) | ((df.End >= start_range) & (df.End <= end_range))
df['Partial_Active_Flag'] = np.where(df.Partial_Active,'Yes','No')
因此,根据您的问题,您可以找到适合您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.