如何让Python/Pandas将YYYY-YY格式识别为时间区间?
处理NBA赛季YYYY-YY格式的时间转换方案
针对NBA跨年度赛季的格式(如1999-00),不需要依赖字符串切片反复处理,用Pandas的Period类型可以完美实现时间范围查询需求——Period本身代表一个连续时间区间,刚好匹配赛季的属性。
方法1:转换为赛季结束年份的年度Period
NBA赛季通常从当年10月持续到次年6月,大部分官方统计会以赛季结束年份作为核心标识(比如2019-20赛季的冠军归属会记在2020年)。我们可以直接将YYYY-YY格式转换为结束年份的年度Period:
import pandas as pd import numpy as np test_df = pd.DataFrame(data={'Season':['1996-97', '1997-98', '1998-99', '1999-00', '2000-01', '2001-02', '2002-03','2003-04','2004-05', '2005-06','2006-07','2007-08', '2008-09', '2009-10', '2010-11', '2011-12'], 'Height':np.random.randint(20, size=16), 'Weight':np.random.randint(40, size=16)}) # 转换Season为结束年份的年度Period test_df['Season_Period'] = test_df['Season'].apply( lambda x: pd.Period(f"{int(x.split('-')[0]) + 1}", freq='A') )
转换后,Season_Period列的每个值都是代表赛季结束年份的年度周期,比如1999-00会变成Period('2000', 'A')。
时间范围查询示例
比如要查询2016至2020年期间的赛季(对应2015-16到2019-20赛季):
# 筛选结束年份在2016到2020之间的赛季 filtered_df = test_df[(test_df['Season_Period'] >= pd.Period('2016', 'A')) & (test_df['Season_Period'] <= pd.Period('2020', 'A'))]
方法2:转换为赛季起止日期的精确Period范围
如果需要区分全明星赛、季后赛这类具体时间节点的查询,可以将赛季转换为包含精确起止日期的Period:
# 转换为赛季起止日的Period test_df['Season_Start'] = test_df['Season'].apply( lambda x: pd.Period(f"{int(x.split('-')[0])}-10-01", freq='D') ) test_df['Season_End'] = test_df['Season'].apply( lambda x: pd.Period(f"{int(x.split('-')[0])+1}-06-30", freq='D') )
精确时间范围查询示例
比如查询1999年全明星赛(假设在2000年2月)到2001年季后赛(假设在2001年5月)期间的赛事数据:
target_start = pd.Period('2000-02-01', freq='D') target_end = pd.Period('2001-05-31', freq='D') # 筛选覆盖目标时间区间的赛季 filtered_df = test_df[(test_df['Season_Start'] <= target_end) & (test_df['Season_End'] >= target_start)]
为什么不用字符串切片?
用Period类型的核心优势:
- 原生支持时间比较、范围筛选,不用手动处理字符串拼接/拆分的冗余逻辑
- 可以直接结合Pandas的时间序列工具(如
resample、rolling)做复杂统计 - 语义更清晰,
Period('2000', 'A')直接对应1999-00赛季的结束年度,比字符串'1999-00'更直观
内容的提问来源于stack exchange,提问作者felipedmc
相关产品推荐
相关产品推荐

