繁体   English   中英

在 pandas dataframe 中以日期为条件创建列

[英]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

我们可以使用简单的日期比较来解决这个问题。

这些合同可能有两种情况:

  1. 合约仅在该范围内有效
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')
  1. 合约在该范围内部分有效(因此它在该范围内开始或在该范围内结束 - 因此它在提供的范围内部分有效)
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM