【问题标题】:Understanding difference in unix epoch time via Python vs. InfluxDB通过 Python 与 InfluxDB 了解 unix 纪元时间的差异
【发布时间】:2017-05-20 13:05:58
【问题描述】:

我一直试图弄清楚如何生成与我在 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 中以编程方式执行此操作,只要它像在结果中添加 9 个 0 一样简单。但我想知道为什么我似乎无法在一次转换中生成相同的精度级别。

我有一个包含大量旧时间戳的 CSV 文件,这些时间戳就是“17 年 4 月 1 日 2:00”。每天凌晨 2 点进行测量。

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

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

【问题讨论】:

    标签: python csv unix influxdb-python


    【解决方案1】:

    可以告诉 InfluxDB 以秒精度返回纪元时间戳,以便更轻松地使用不支持开箱即用的纳秒精度的工具/库,例如 Python。

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

    influx HTTP API timestamp format documentation

    【讨论】:

      【解决方案2】:

      这样的事情应该可以解决您当前的问题。我没有测试 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 模块不同的精度类型。不幸的是,除了对日期转换进行字符串操作之外,我真的没有看到任何绕过它的方法。

      【讨论】:

        猜你喜欢
        • 2016-04-26
        • 2020-08-07
        • 2021-06-20
        • 2012-01-30
        • 2018-06-22
        • 1970-01-01
        • 2011-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多