0

0

Python二进制数据到日期时间戳的转换教程

碧海醫心

碧海醫心

发布时间:2025-10-21 13:54:10

|

383人浏览过

|

来源于php中文网

原创

Python二进制数据到日期时间戳的转换教程

本教程详细介绍了如何将特定格式的二进制数据转换为精确的日期时间戳。通过对二进制模式的深入分析,我们发现了一种基于字节提取、反转、位移和常数偏移的转换方法。文章提供了python实现代码,并利用pandas库处理时区和验证转换结果,旨在帮助读者理解和解决类似二进制时间戳解析问题。

在数据处理领域,我们经常会遇到需要解析非标准格式二进制数据的情况,其中将二进制编码的时间戳转换为可读的日期时间是一个常见挑战。本教程将引导您完成一个具体的案例,展示如何通过模式识别、位操作和Python编程,将一组特定的二进制字节序列转换为准确的日期时间对象。

问题分析与模式识别

我们面对的二进制数据格式如下所示(以十六进制表示),其中每个序列都对应一个特定的日期时间:

30 65 1a eb e3 f2 96 c5 41  -- 对应 2023年12月16日 15:03
30 c6 36 85 70 8a 97 c5 41  -- 对应 2023年12月17日 12:37
30 4a 26 1b 6b 29 74 c4 41  -- 对应 2022年10月1日 12:49

通过观察这些样本,我们可以发现一些关键模式:

  1. 固定字节: 序列的第一个字节 30 和最后两个字节 c5 41 (或 c4 41 在2022年的例子中) 似乎是固定或半固定的,可能作为数据的起始/结束标记或某种元数据。真正的日期时间信息可能隐藏在中间的7个字节中。
  2. 时间关联变化: 仔细对比 2023年12月16日 和 2023年12月17日 的数据,发现倒数第三个字节从 96 变为 97。这表明这些字节与时间变化存在直接关联。

这些观察提示我们,需要关注中间的7个字节,并尝试将其解释为一个随时间变化的数值。

立即学习Python免费学习笔记(深入)”;

核心转换逻辑

经过进一步的实验和分析,我们发现了一个有效的转换路径:

  1. 提取并反转核心字节: 忽略第一个字节和最后两个字节,提取中间的7个字节。然后,将这7个字节的顺序反转。
  2. 转换为整数: 将反转后的字节序列拼接成一个十六进制字符串,并将其转换为十进制整数。
  3. 位移操作: 对得到的整数进行右移23位 (>> 23) 操作。这个操作相当于将整数除以 2^23。这种位移通常用于从一个更大的数值中提取特定比例的时间信息,或者处理编码中的精度。
  4. 应用常数偏移: 从位移后的结果中减去一个经验性的常数 4927272860。这个常数是根据已知日期时间与计算结果之间的差值校准得出的,它将原始的编码值映射到Unix时间戳(自1970年1月1日00:00:00 UTC以来的秒数)。

我们将上述逻辑封装在一个Python函数 f(k) 中:

def f(k):
    """
    将二进制字符串中的核心字节转换为一个基于Epoch的近似秒数。

    Args:
        k (str): 包含十六进制字节的字符串,例如 '30 65 1a eb e3 f2 96 c5 41'。

    Returns:
        int: 转换后的近似Epoch秒数。
    """
    # 1. 移除第一个和最后两个字节,并反转剩余字节的顺序
    #    k.split()[1:-1] 得到 ['65', '1a', 'eb', 'e3', 'f2', '96', 'c5']
    #    [::-1] 反转为 ['c5', '96', 'f2', 'e3', 'eb', '1a', '65']
    #    ''.join(...) 拼接成 'c596f2e3eb1a65'
    # 2. 将十六进制字符串转换为整数
    # 3. 右移23位
    # 4. 减去经验常数偏移
    return (int(''.join(k.split()[1:-1][::-1]), 16) >> 23) - 4927272860

处理时区与精度

在时间戳转换中,时区是一个不可忽视的因素。原始数据中2022年10月的日期与预期结果存在3600秒(1小时)的误差,这强烈暗示了夏令时(DST)的影响。因此,在将Epoch秒数转换为具体的日期时间对象时,我们需要指定正确的时区。

Python快速入门
Python快速入门

快速学习python书第二版是一本简洁清晰介绍python3的书籍,目标是新学习python 的程序员。这本更新版本囊括了所有python3版本的变化,即python从早期版本到新版本的特性变化 本书一开始用基础但是很有用的程序来传授给读者关于python的核心特性,包括语法,控制流程和数据结构。然后本书使用大型的应用程序包括代码管理,面向对象编程,web开发和转换老版本的python程序到新的版本等等。 忠实于作者的经验十足的开发者的观众,作者仔细检查普通程序特点,同时增加了更多细节关于这些python

下载

为了实现健壮的日期时间处理,我们推荐使用 pandas 库,它提供了强大的 Timestamp 对象和时区管理功能。

import pandas as pd

# 定义目标时区,根据数据来源地选择
tz = 'Europe/Zurich' # 假设数据来自欧洲/苏黎世时区

def to_time(k, tz):
    """
    将二进制字符串转换为带有时区信息的pandas Timestamp对象。

    Args:
        k (str): 包含十六进制字节的字符串。
        tz (str): 目标时区字符串,例如 'Europe/Zurich'。

    Returns:
        pandas.Timestamp: 转换后的带有时区信息的日期时间对象。
    """
    # f(k) 返回的是Epoch秒数
    # pd.Timestamp 默认接收纳秒级时间戳,所以需要乘以 1e9
    return pd.Timestamp(f(k) * 1e9, tz=tz)

# 示例数据及对应的参考时间
examples = {
    '30 65 1a eb e3 f2 96 c5 41': '16 December 2023 at 15:03',
    '30 c6 36 85 70 8a 97 c5 41': '17 December 2023 at 12:37',
    '30 4a 26 1b 6b 29 74 c4 41': '1 October 2022 at 12:49',
    '30 23 84 b1 a8 b5 97 c5 41': '17 December 2023 at 18:45',
    '30 3f 91 e7 96 b5 97 c5 41': '17 December 2023 at 18:45:30',
    '30 a6 d6 2f d1 b5 97 c5 41': '17 December 2023 at 18:46',
    '30 e8 16 9c b9 b5 97 c5 41': '17 December 2023 at 18:47',
}

# 将参考时间转换为带有时区信息的pandas Timestamp对象,并按时间排序
examples = dict(sorted([
    (k, pd.Timestamp(v, tz=tz)) for k, v in examples.items()
], key=lambda item: item[1]))

结果验证与注意事项

为了验证转换的准确性,我们可以将计算出的时间与原始参考时间进行对比,并计算它们之间的秒数差。

fmt = '%F %T %Z' # 定义日期时间格式化字符串

test_results = [
    (
        f'{v:{fmt}}',                       # 参考时间
        f'{to_time(k, tz=tz):{fmt}}',       # 估算时间
        (to_time(k, tz=tz) - v).total_seconds(), # 差异(秒)
    )
    for k, v in examples.items()
]

# 打印测试结果
for result in test_results:
    print(f"参考时间: {result[0]}, 估算时间: {result[1]}, 差异 (秒): {result[2]}")

运行上述代码,您将看到类似以下的结果:

参考时间: 2022-10-01 12:49:00 CEST, 估算时间: 2022-10-01 12:49:30 CEST, 差异 (秒): 30.0
参考时间: 2023-12-16 15:03:00 CET, 估算时间: 2023-12-16 15:03:23 CET, 差异 (秒): 23.0
参考时间: 2023-12-17 12:37:00 CET, 估算时间: 2023-12-17 12:36:37 CET, 差异 (秒): -23.0
参考时间: 2023-12-17 18:45:00 CET, 估算时间: 2023-12-17 18:45:25 CET, 差异 (秒): 25.0
参考时间: 2023-12-17 18:45:30 CET, 估算时间: 2023-12-17 18:44:49 CET, 差异 (秒): -41.0
参考时间: 2023-12-17 18:46:00 CET, 估算时间: 2023-12-17 18:46:46 CET, 差异 (秒): 46.0
参考时间: 2023-12-17 18:47:00 CET, 估算时间: 2023-12-17 18:45:59 CET, 差异 (秒): -61.0

从结果可以看出,转换后的时间与参考时间之间存在数十秒的差异。这表明当前的常数偏移 4927272860 只是一个近似值,可能需要根据更多的样本数据进行微调,以达到更高的精度。

总结

本教程展示了如何通过逆向工程和Python编程,将一种特定的二进制时间戳格式转换为可读的日期时间。关键步骤包括:识别并提取核心数据字节、反转字节顺序、进行位移操作、以及应用一个经验性的常数偏移来校准到Unix Epoch时间。同时,我们强调了使用 pandas 处理时区的重要性,以确保日期时间的准确性和健壮性。

虽然当前的转换方法能提供相当准确的结果,但若要达到完美匹配,可能需要更多的数据样本来精确调整位移常数和偏移量。在实际应用中,这种方法为解析未知或专有二进制时间戳提供了一个强大的起点。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

750

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

635

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

758

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1262

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

706

2023.08.11

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号