Python多日期解析实现筛选含未平仓头寸的投资组合问题
实现方案
日期提取问题解决
你无法提取两个日期的核心原因是拆分头寸字符串时未限制拆分次数,正确的拆分方式是使用带maxsplit参数的split方法:
对头寸部分执行split(':', 2),最多拆分2次,会直接返回[头寸名称, 开始日期字符串, 结束日期字符串]三个元素,完美提取两个日期字段,即便头寸名称中包含冒号也不会影响日期解析。
完整函数实现
def get_portfolios_with_open_positions(date_str: str, portfolio_strings: List[str]) -> List[str]: # 转换查询日期为datetime对象 query_date = datetime.strptime(date_str, DATE_FORMAT) result = [] added_portfolios = set() # 避免重复返回同一投资组合 for portfolio_line in portfolio_strings: # 拆分投资组合名称和头寸信息 portfolio_name, position_info = portfolio_line.split('|', 1) # 拆分头寸的名称、开始日期、结束日期 position_parts = position_info.split(':', 2) start_date_str = position_parts[1] end_date_str = position_parts[2].strip() if len(position_parts) >=3 else '' # 转换头寸日期 start_date = datetime.strptime(start_date_str, DATE_FORMAT) if end_date_str: end_date = datetime.strptime(end_date_str, DATE_FORMAT) else: # 结束日期未指定时设为最大日期,代表永久有效 end_date = datetime.max # 判定是否为未平仓头寸 if query_date >= start_date and query_date < end_date: if portfolio_name not in added_portfolios: added_portfolios.add(portfolio_name) result.append(portfolio_name) return result
逻辑说明
- 首先将输入的查询日期转换为datetime类型,避免字符串比较的逻辑错误
- 每个投资组合字符串先按
|拆分1次,分离组合名称和头寸信息 - 头寸信息按
:拆分2次,直接获取两个日期字段,解决多日期提取问题 - 结束日期为空时默认判定为未结束,符合规则要求
- 用集合去重,确保同一投资组合即使有多个未平仓头寸也只返回一次
内容的提问来源于stack exchange,提问作者BadBoyClub
相关产品推荐
相关产品推荐

