有关破译时髦文件时间戳格式的提示?

时间:2014-02-05 14:47:45

标签: python timestamp

我们拥有一系列科学仪器,这些仪器具有在Windows 7 / Vista平台上运行的专有图像分析软件。该软件以二进制格式保存一系列质量控制指标。一位积极进取的程序员编写了一个python库,用于从这些度量文件中提取和分类数据。我正在使用它,但有一个非常有趣的指标,我无法解密。在库代码中:

def parse_binary(self):
    bs = self.bs

    # Extraction Metrics (ExtractionMetricsOut.bin)
    # Contains extraction metrics such as fwhm (full width at half maximum) scores and raw intensities
    # Format:
    #   byte 0: file version number (2)
    #   byte 1: length of each record
    #   bytes (N * 38 + 2) - (N *38 + 39): record:
    #     2 bytes: lane number (uint16)
    #     2 bytes: tile number (uint16)
    #     2 bytes: cycle number (uint16)
    #     4 x 4 bytes: fwhm scores (float) for channel [A, C, G, T] respectively 
    #     2 x 4 bytes: intensities (uint16) for channel [A, C, G, T] respectively 
    #---->8 bytes: date/time of CIF creation --> 2 x 4 bytes for date and timestamp 
    #   ...Where N is the record index
        self.apparent_file_version = bs.read('uintle:8')
        self.check_version(self.apparent_file_version)

        recordlen = bs.read('uintle:8')  # length of each record

        for i in range(0,((bs.len) / (recordlen * 8))):  # record length in bits
            #OMITTED: obtain various data
            #...
            # 8 bytes: date/time of CIF creation
            self.data['datetime'].append(bs.read('uintle:32'))
            self.data['timestamp'].append(bs.read('uintle:32'))

self.df = pandas.DataFrame(self.data)

在python控制台中,当我检查数据时,'datetime'数据毫无意义。但时间戳数据更有趣:

“exmets”是一个大熊猫数据框,其中包含2013年6月5日至2013年6月16日期间11天课程的指标:

>>> len(exmets.data['timestamp'])
226559
>>> len(exmets.data['datetime'])
226559

>>> exmets.data['datetime'][1:10]
[2861233716L, 2934210013L, 2764566050L, 2864234016L, 2767136307L, 2817880381L, 2936700262L, 2820490642L, 2769576551L, 2866944287L]

>>> exmets.data['datetime'][100000:100010]
[4093949428L, 4104309713L, 4090699103L, 4094859519L, 4094289462L, 4098919713L, 4104359713L, 4104359713L, 4132262259L, 4150663099L]

就像我说的,'datetime'很奇怪。但'时间戳'似乎更加规律:

    >>>exmets.data['timestamp'][1:10]
[2295344086L, 2295344086L, 2295344086L, 2295344086L, 2295344086L, 2295344086L, 2295344086L, 2295344086L, 2295344086L]

    >>>exmets.data['timestamp'][100000:100010]
[2295345531L, 2295345531L, 2295345531L, 2295345531L, 2295345531L, 2295345531L, 2295345531L, 2295345531L, 2295345531L, 2295345531L]

    >>>exmets.data['timestamp'][226549:226559]
[2295347466L, 2295347466L, 2295347466L, 2295347466L, 2295347466L, 2295347466L, 2295347466L, 2295347466L, 2295347466L, 2295347466L]

所以从开始到结束都有一个规律的进展,但是如果你认为这些数字意味着几秒钟,则会有2296347466 - 2295344086 = 3380的差异,相当于以秒为单位的不到一小时。假设这些秒是不正确的,因为机器生成了11天跨度的数据。

关于如何破译这个的任何想法?

1 个答案:

答案 0 :(得分:2)

我写了那个图书馆! :)

重要更新

在联系Illumina之后,我被告知有两个启示:

  1. 我错误地解析了两个字段的日期和时间;它实际上是一个64位有符号整数。

  2. 这个64位有符号整数是一个C#DateTime,从公历1 AD开始计算100纳秒的增量(在python,datetime.datetime(1,1,1)中)。

  3. 旧答案如下 ...

    你是如此接近答案。使用您提供的号码检查一下:

    In [59]: 2296347466 - 2295344086 
    Out[59]: 1003380
    
    In [65]: 1003380.0 / 24 / 60 / 60
    Out[65]: 11.613194444444444
    

    换句话说,它在几秒钟内!

    我仍然不太了解时间戳的格式,所以这不是一个完整的答案,但我想我至少会分享我目前所知的内容。

    通过考虑序列发生器如何将数据输出到二进制文件,可以推断出部分神秘感。

    Illumina序列发生器如何将数据输出到二进制文件

    关于Illumina测序仪的一个重要事项是,二进制文件中出现的内容对我们这些愚蠢的人类来说有点非线性。通过按时间戳排序时,可以看到有关循环#2 /磁贴1101的信息出现在循环#1 /磁贴1103之前(例如)。

    最可能的原因是序列发生器没有连续地将信息输送到文件,而是在缓冲区中存储了大量内容并一次性写入所有内容。

    这与时间戳中看到的相匹配,即时间戳似乎表明缓冲区中的累积数据何时被写入磁盘,而不是有问题的磁贴成像的时刻。

    试试这个:

    print len(exmets.df.timestamp.unique())
    print len(exmets.df.datetime.unique())
    

    您会发现您拥有的唯一时间戳远远少于唯一的日期时间。此外,时间戳也可能具有非常规则的间隔。我工作的时间不是11天,最多只能工作36小时,因此我的数据间隔大约相隔5秒。 (我有兴趣知道你的数据是什么样的。)

    所以我最好的猜测是这个时间戳是秒 - 自 - 纪元,除了我不知道它可能引用哪个纪元。我的第一个猜测是NTFS(自1601年1月1日1601 00:00:00 UTC以来100纳秒测量),但这根本没有用。