通过 Python 与 InfluxDB 了解 unix 纪元时间的差异

Understanding difference in unix epoch time via Python vs. InfluxDB

我一直在尝试找出如何生成与我在 InfluxDB 中测量条目旁边看到的相同的 Unix 纪元时间。

首先让我说我正在尝试在所有测试中使用相同的日期和时间:

April 01, 2017 at 2:00AM CDT

如果我在 InfluxDB 中查看测量,我会看到时间戳,例如:

1491030000000000000

如果我使用 -precision rfc3339 在 InfluxDB 中查看该测量,它显示为:

2017-04-01T07:00:00Z

所以我可以看到 InfluxDB 使用的是 UTC

不过,我似乎无法通过 Python 生成相同的时间戳。

例如,我尝试了几种不同的方法:

>>> calendar.timegm(time.strptime('04/01/2017 02:00:00', '%m/%d/%Y %H:%M:%S'))
1491012000

>>> calendar.timegm(time.strptime('04/01/2017 07:00:00', '%m/%d/%Y %H:%M:%S'))
1491030000

>>> t = datetime.datetime(2017,04,01,02,00,00)
>>> print "Epoch Seconds:", time.mktime(t.timetuple())
Epoch Seconds: 1491030000.0

上面的最后两个示例至少给我提供了相同的数字,但它比 InfluxDB 的数字短得多。我假设这与精度有关,我认为 InfluxDB 可以做到纳秒级?

Python Result: 1491030000
Influx Result: 1491030000000000000

如果我尝试使用结果 Python 将测量值输入 InfluxDB,它最终显示为:

1491030000 = 1970-01-01T00:00:01.49103Z

所以我必须添加额外的九个 0。

我想有几种方法可以在 Python 中以编程方式执行此操作,只要它像在结果中添加九个 0 一样简单。但我想知道为什么我似乎无法在一次转换中生成相同的精度级别。

我有一个 CSV 文件,其中包含大量简单的旧时间戳,“4/1/17 2:00”。每天凌晨2点有测量

我需要能够将其转换为 InfluxDB 需要“1491030000000000000”以插入所有这些旧测量值的正确格式。

在 Python 中更好地理解正在发生的事情以及原因比如何以编程方式解决这个问题更重要。尽管我会很感激能同时做到这两点的回应;解释这个问题和我所看到的,为什么以及关于如何使用包含显示为“4/1/17 2:00”的时间戳的一列的 CSV 并将它们转换为显示为的时间戳的想法“1491030000000000000”在单独的文件或第二列中。

像这样的东西应该可以解决您当前的问题。我没有测试 csv 来尝试这个,但它可能对你有用。它将获取您放置在 "old.csv" 位置的任何 csv 文件,并创建第二个 csv,时间戳以纳秒为单位。

import time
import datetime
import csv

def convertToNano(date):
    s = date
    secondsTimestamp = time.mktime(datetime.datetime.strptime(s, "%d/%m/%y %H:%M").timetuple())
    nanoTimestamp = str(secondsTimestamp).replace(".0", "000000000")
    return nanoTimestamp
with open('old.csv', 'rb') as old_csv:
    csv_reader = csv.reader(old_csv)
    with open('new.csv', 'wb') as new_csv:
        csv_writer = csv.writer(new_csv)
        for i, row in enumerate(csv_reader):
            if i != 0:
                # Put whatever rows the data appears in and the row you want the data to go in here
                row.append(convertToNano(row[<location of date in the row>]))
                csv_writer.writerow(row)

至于为什么会发生这种情况,在阅读 this 之后,您似乎不是唯一对这个问题感到沮丧的人。似乎 influxdb 恰好使用了与大多数 python 模块不同的精度类型。不幸的是,除了对日期转换进行字符串操作之外,我真的没有找到任何解决方法。

InfluxDB 可以被告知 return 秒级精度的纪元时间戳,以便更轻松地使用 tools/libraries 不支持开箱即用的纳秒级精度,例如 Python。

在查询参数中设置 epoch=s 以启用此功能。

参见influx HTTP API timestamp format documentation