如何基于Datetime范围为Pandas DataFrame分配标签列值?
问题描述
我有一个字典,键为标签,值是包含起始和结束Datetime的列表:
d = {'A': [2020-01-01 00:00:00+00:00, 2024-01-24 00:00:00+00:00]}
我有一个含time列的DataFrame,希望当time列的Datetime落在字典对应标签的时间范围内时,为其分配该标签,处理后示例如下:
ID time Label 1 2024-01-23 00:00:00+00:00 A
处理纯日期时我使用以下代码:
for k, (s, e) in d.items(): df.loc[df["time"].isin(pd.date_range(s, e)), 'Label'] = k
但pd.date_range函数不适用于Datetime范围匹配,请问如何修改代码以适配时间范围而非日期范围?
解决方案
不需要生成完整的时间序列来匹配,直接通过布尔条件判断时间是否落在目标区间内即可,这种方法既支持带时区的Datetime,也更高效。
修改后的代码示例:
import pandas as pd # 初始化字典与DataFrame(确保时间为pd.Timestamp类型) d = {'A': [pd.Timestamp('2020-01-01 00:00:00+00:00'), pd.Timestamp('2024-01-24 00:00:00+00:00')]} df = pd.DataFrame({'ID': [1], 'time': [pd.Timestamp('2024-01-23 00:00:00+00:00')]}) for label, (start_time, end_time) in d.items(): # 直接判断time列的值是否在[start_time, end_time]区间内 df.loc[(df['time'] >= start_time) & (df['time'] <= end_time), 'Label'] = label
关键说明
- 确保字典中的起始/结束时间为
pd.Timestamp类型,如果原始数据是字符串,可通过pd.to_datetime()转换 - 若存在多标签时间区间重叠的情况,后执行的标签会覆盖先执行的结果,如需自定义优先级可调整循环顺序或添加额外判断逻辑
- 此方法避免了生成海量时间点,在处理大数据集时性能优势明显
内容的提问来源于stack exchange,提问作者Anna Ortega
相关产品推荐
相关产品推荐

