迁移InfluxDB至MySQL:如何将CSV中的InfluxDB时间戳转换为日期和时间列?
解决纳秒级Epoch时间戳转日期/时间列的问题
嘿,我一眼就看出问题在哪啦!你手里的这个19位时间戳是纳秒级的纪元时间,而Python的datetime.fromtimestamp()默认只认秒级的时间戳——直接传这么大的数字进去,它肯定懵圈,要么报错要么给你一个离谱的未来日期。
核心解决思路
把纳秒时间戳除以1e9(也就是10的9次方),转换成带小数的秒级时间戳,这样datetime模块就能正确识别了。之后你再把转换后的datetime对象拆分成独立的日期和时间列就行。
单条时间戳转换示例
先给你个简单的测试代码,验证转换逻辑:
from datetime import datetime, timezone # 你的纳秒级时间戳 ns_ts = 1578152602608558363 # 转成秒级时间戳(浮点数) sec_ts = ns_ts / 1e9 # 转换成UTC时区的datetime对象 utc_datetime = datetime.fromtimestamp(sec_ts, timezone.utc) # 拆分日期和时间 date_part = utc_datetime.date().isoformat() time_part = utc_datetime.time().isoformat() print(f"转换后的日期: {date_part}") print(f"转换后的时间: {time_part}")
运行这段代码,你会得到:
转换后的日期: 2020-01-04 转换后的时间: 07:23:22.608558
完全符合正常的时间范围!
批量处理CSV文件(适合迁移MySQL)
如果你要处理整个CSV文件,用pandas会更高效,直接批量转换并拆分列:
import pandas as pd from datetime import datetime, timezone # 读取原始CSV df = pd.read_csv("your_influx_export.csv") # 批量转换时间戳为UTC datetime df["utc_datetime"] = df["time"].apply(lambda x: datetime.fromtimestamp(x / 1e9, timezone.utc)) # 拆分出日期和时间列 df["date"] = df["utc_datetime"].dt.date df["time"] = df["utc_datetime"].dt.time # 可选:移除中间的datetime列,保留需要的字段 df = df.drop("utc_datetime", axis=1) # 保存转换后的CSV,方便导入MySQL df.to_csv("converted_for_mysql.csv", index=False)
这个处理后的CSV里,date是纯日期格式,time是纯时间格式,直接导入MySQL的DATE和TIME类型字段就行。
补充说明
为什么之前的代码不行?因为1578152602608558363作为秒级时间戳的话,对应的是几十亿年后的时间,早就超出了Pythondatetime能处理的范围(一般到2038年左右,取决于系统),所以肯定会报错或者无法识别。只要先除以1e9转成纳秒→秒的单位,问题就迎刃而解啦!
内容的提问来源于stack exchange,提问作者Isaac
相关产品推荐
相关产品推荐

