Python按日期时间分割DataFrame时间序列列的实现方法
报错原因
你写的切片代码触发SyntaxError的直接原因是切片区间内的时间值没有加字符串引号,Python会把2022-04-01 11:52:39+00:00识别为算术表达式,碰到04这类带前导零的数字就会抛出对应错误,和pandas的时间序列逻辑无关。
基础修复:单段时间切片正确写法
pandas的DatetimeIndex原生支持字符串形式的时间范围切片,只要给时间值加上引号、和原索引的时区格式匹配即可,正确写法如下:
# 时间字符串两端加单/双引号即可 TS_1 = DF['Column_Name']['2022-04-01 11:52:39+00:00':'2022-04-01 23:57:39+00:00']
如果你的索引已经是pandas识别的标准datetime类型,不需要写完整时间戳,直接传日期字符串就能取对应全天的数据,比如DF['Column_Name']['2022-04-01']就可以拿到4月1日的所有记录。
批量拆分前先确认索引类型,如果当前索引是字符串格式,先跑这行代码转成标准时间索引:
import pandas as pd # 转换为匹配你现有格式的带UTC时区的时间索引 DF.index = pd.to_datetime(DF.index, utc=True)
批量拆分时间序列方案
两种常用实现可以按需选择,支持任意拆分粒度,不需要手动计算每段的起止时间。
- 自定义拆分间隔只需要修改
freq参数即可:D代表天、W代表周、H代表小时,比如3D就是3天一段、12H就是12小时一段。
方案1:字典存储独立序列(推荐)
每个分段是独立的Series对象,用分段标识作为key,不会因为不同分段的时间点不一致产生冗余NaN值,灵活度最高:
# 按日拆分示例 daily_series = {} for date, segment_df in DF.groupby(DF.index.date): daily_series[date] = segment_df['Column_Name'].copy() # 按周拆分示例(每周一为周起始点) weekly_series = {} for week_mark, segment_df in DF.groupby(pd.Grouper(freq='W-MON')): if len(segment_df) == 0: continue weekly_series[week_mark.date()] = segment_df['Column_Name'].copy() # 调用方法:直接按key取对应分段即可 # ts_0401 = daily_series[pd.to_datetime('2022-04-01').date()]
方案2:拆分结果合并为新DataFrame
每个时间分段对应新表的一列,适合需要横向对比不同分段数据的场景,会自动按索引对齐不同分段的时间点,缺失位置填充NaN:
# 按日拆分示例:按日内时分秒对齐不同日期的序列 daily_split_df = pd.DataFrame() for date, segment_df in DF.groupby(DF.index.date): seg = segment_df['Column_Name'].copy() # 索引替换为当日的时分秒,作为跨日期对齐的依据 seg.index = seg.index.time daily_split_df[str(date)] = seg # 按周拆分示例:按周内时间偏移对齐不同周的序列 weekly_split_df = pd.DataFrame() for week_mark, segment_df in DF.groupby(pd.Grouper(freq='W-MON')): if len(segment_df) == 0: continue seg = segment_df['Column_Name'].copy() # 索引替换为距本周第一个数据点的时间差,作为跨周对齐的依据 seg.index = seg.index - seg.index.min() weekly_split_df[f'week_{week_mark.date()}'] = seg
注意:如果拆分后需要做时序统计、建模类操作,优先选方案1,独立序列不会被对齐操作引入的NaN干扰。
内容的提问来源于stack exchange,提问作者erkvos
相关产品推荐
相关产品推荐

