如何使用Pandas将DataFrame日期时间列回退1小时
解决DataFrame中日期小时回退1小时的问题
看起来你需要把DataFrame里的时间整体回退1小时,同时处理跨天的情况(比如凌晨0点回退到前一天的23点)。我来帮你一步步实现这个需求:
核心思路
我们可以先把日期列和小时编码列合并成标准的datetime类型,这样就能方便地进行时间加减操作,之后再拆分回原来的日期和小时编码格式,替换原DataFrame的对应列。
具体实现代码
import pandas as pd # 假设你的DataFrame已经存在,名为df1 # 第一步:处理前一组时间列(列1和列2) # 合并日期和小时编码为datetime字符串:YYYYMMDD + HH(小时编码转成2位小时) df1['temp_datetime1'] = pd.to_datetime( df1[1].astype(str) + df1[2].astype(str).str.zfill(4).str[:2], format='%Y%m%d%H' ) # 回退1小时 df1['temp_datetime1'] = df1['temp_datetime1'] - pd.Timedelta(hours=1) # 拆分回日期(YYYYMMDD)和小时编码(HH*100) df1[1] = df1['temp_datetime1'].dt.strftime('%Y%m%d').astype(int) df1[2] = df1['temp_datetime1'].dt.hour * 100 # 第二步:处理后一组时间列(列4和列5) df1['temp_datetime2'] = pd.to_datetime( df1[4].astype(str) + df1[5].astype(str).str.zfill(4).str[:2], format='%Y%m%d%H' ) df1['temp_datetime2'] = df1['temp_datetime2'] - pd.Timedelta(hours=1) df1[4] = df1['temp_datetime2'].dt.strftime('%Y%m%d').astype(int) df1[5] = df1['temp_datetime2'].dt.hour * 100 # 清理临时列 df1.drop(['temp_datetime1', 'temp_datetime2'], axis=1, inplace=True)
代码解释
- 合并时间列:我们把日期列(列1、列4)转成字符串,小时编码列(列2、列5)转成字符串后补前导零到4位(比如
100变成0100),取前两位得到小时数,然后拼接成YYYYMMDDHH格式的字符串,再转成datetime类型。 - 时间回退:用
pd.Timedelta(hours=1)来减去1小时,自动处理跨天的情况(比如2017-01-01 00:00减去1小时会变成2016-12-31 23:00)。 - 拆分回原格式:把处理后的
datetime转成YYYYMMDD格式的整数作为新的日期列,小时数乘以100得到新的小时编码列(比如23点变成2300,0点变成0)。 - 清理临时列:最后删除我们创建的临时datetime列,保持DataFrame整洁。
这样处理后,你的DataFrame就会完全符合你期望的时间格式啦。
内容的提问来源于stack exchange,提问作者user2100039
相关产品推荐
相关产品推荐

