如何在Pandas中按规则调整DataFrame的DateTime列时间
Pandas Datetime列时间批量规整方案
需求说明
需要对Pandas DataFrame中的datetime类型列按以下规则调整时间:
- 分钟处于16↔45区间:将分钟改为30,小时保持不变
- 分钟处于46↔59或0↔15区间:将分钟改为00,其中46-59的情况需要将小时加1(处理跨小时场景)
输入示例:
datetime 2022/11/15 00:29 2022/11/15 00:29 2022/11/15 00:29 2022/11/15 00:59 2022/11/15 00:59 2022/11/15 00:59 2022/11/15 01:35 2022/11/15 01:35 2022/11/15 01:35 2022/11/15 02:01 2022/11/15 02:01 2022/11/15 02:01 2022/11/15 02:45 2022/11/15 02:45 2022/11/15 02:45 2022/11/15 02:48 2022/11/15 02:48 2022/11/15 02:48
目标输出:
datetime 2022/11/15 00:30 2022/11/15 00:30 2022/11/15 00:30 2022/11/15 01:00 2022/11/15 01:00 2022/11/15 01:00 2022/11/15 01:30 2022/11/15 01:30 2022/11/15 01:30 2022/11/15 02:00 2022/11/15 02:00 2022/11/15 02:00 2022/11/15 02:30 2022/11/15 02:30 2022/11/15 02:30 2022/11/15 03:00 2022/11/15 03:00 2022/11/15 03:00
实现代码
利用Pandas矢量化操作高效处理,无需逐行循环:
import pandas as pd # 构造输入数据 data = { 'datetime': [ '2022/11/15 00:29', '2022/11/15 00:29', '2022/11/15 00:29', '2022/11/15 00:59', '2022/11/15 00:59', '2022/11/15 00:59', '2022/11/15 01:35', '2022/11/15 01:35', '2022/11/15 01:35', '2022/11/15 02:01', '2022/11/15 02:01', '2022/11/15 02:01', '2022/11/15 02:45', '2022/11/15 02:45', '2022/11/15 02:45', '2022/11/15 02:48', '2022/11/15 02:48', '2022/11/15 02:48' ] } df = pd.DataFrame(data) # 转换为datetime类型 df['datetime'] = pd.to_datetime(df['datetime']) # 提取分钟数 minutes = df['datetime'].dt.minute # 划分条件区间 mask_30 = (minutes >= 16) & (minutes <= 45) mask_00 = ~mask_30 # 处理30分钟场景 df.loc[mask_30, 'datetime'] = df.loc[mask_30, 'datetime'].dt.floor('H') + pd.Timedelta(minutes=30) # 处理00分钟场景:0-15保留当前小时,46-59加1小时 df.loc[mask_00, 'datetime'] = df.loc[mask_00, 'datetime'].dt.floor('H') df.loc[(minutes >= 46), 'datetime'] += pd.Timedelta(hours=1) # 按指定格式输出结果 print(df['datetime'].dt.strftime('%Y/%m/%d %H:%M'))
代码说明
- 类型转换:先将字符串列转为
datetime类型,方便后续时间操作 - 条件划分:通过提取分钟数区分两个调整区间
- 时间调整:
- 16-45分钟:先向下取整到小时,再加30分钟得到目标时间
- 0-15分钟:直接向下取整到小时,分钟自动设为00
- 46-59分钟:向下取整到小时后加1小时,实现跨小时的00分钟调整
- 性能优势:全程采用Pandas矢量化操作,处理数千行数据效率极高,避免循环带来的性能损耗
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

