通过Python与InfluxDB了解unix时代的差异

时间:2017-05-20 13:05:58

标签: python csv unix influxdb-python

我一直在试图弄清楚如何生成我在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

所以我必须加上额外的9个0。

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

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

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

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

2 个答案:

答案 0 :(得分:0)

这样的事情应该可以解决你当前的问题。我没有测试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之后,您似乎并不是唯一一个对此问题感到沮丧的人。看起来好像大多数python模块都使用了不同类型的精度。不幸的是,我没有看到任何解决方法,而不是对日期转换进行字符串操作。

答案 1 :(得分:0)

可以告诉InfluxDB以第二精度返回纪元时间戳,以便更容易使用不支持纳秒精度的工具/库,如Python。

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

请参阅influx HTTP API timestamp format documentation