如何移除DataFrame时间数据的小数秒以实现多表合并
解决DataFrame基于时间戳合并(去除小数秒匹配)的问题
我来帮你搞定这个时间戳匹配的难题!你遇到的核心问题是Excel时间本质是数值型的小数(1天=1,小数部分对应时分秒毫秒),所以光改显示格式根本没法去掉实际存储的毫秒值,必须在Pandas里直接处理数据本身,具体步骤如下:
步骤1:确保时间列转为Datetime类型
首先要把两个DataFrame的Time列统一转成Pandas的datetime类型,不管你读进来的是字符串还是Excel的数值时间,这一步都能统一格式:
import pandas as pd # 读取两个Excel文件 df1 = pd.read_excel("你的第一个文件.xlsx") df2 = pd.read_excel("你的第二个文件.xlsx") # 转换为datetime类型(自动识别绝大多数时间格式,包括Excel数值) df1["Time"] = pd.to_datetime(df1["Time"]) df2["Time"] = pd.to_datetime(df2["Time"])
步骤2:移除df1的小数秒
Pandas的datetime类型有专门的方法可以快速截断或取整到整秒,你可以根据需求选下面任意一种:
- 向下取整(直接去掉小数秒):适合不需要四舍五入的场景
df1["Time"] = df1["Time"].dt.floor("S") - 四舍五入到整秒:如果需要更精准的时间对齐
df1["Time"] = df1["Time"].dt.round("S") - 向上取整:少数需要把0.1秒也算成下一秒的场景
df1["Time"] = df1["Time"].dt.ceil("S")
步骤3:基于处理后的时间戳合并DataFrame
现在两个DataFrame的Time列都是整秒格式了,直接用merge函数合并即可,连接方式根据你的需求选择:
# 内连接:只保留两边都存在的时间记录(最常用) merged_df = pd.merge(df1, df2, on="Time", how="inner") # 左连接:保留df1所有记录,匹配不到的df2字段填NaN # merged_df = pd.merge(df1, df2, on="Time", how="left") # 右连接:保留df2所有记录,匹配不到的df1字段填NaN # merged_df = pd.merge(df1, df2, on="Time", how="right")
补充说明
为什么Excel里改格式没用?因为Excel的时间是以天数为单位的浮点数,比如2024-05-20 12:34:56.789在Excel里存储的是一个类似45432.5242915的数值,格式只是改变显示方式,实际存储的小数部分(毫秒)依然存在,所以必须在Pandas里修改数据本身才能实现匹配。
内容的提问来源于stack exchange,提问作者MDS
相关产品推荐
相关产品推荐

