2017-05-20 20 views
1

私はInfluxDB内で測定項目の隣に表示されているのと同じUnixエポック時間を生成する方法を見つけようとしています。PythonとInfluxDBの違いによるUnixエポック時間の違いの理解

私はすべてのテストで同じ日付と時刻を使用しようとしていますと言ってみましょう:

1491030000000000000 
:私はInfluxDBで測定を閲覧

April 01, 2017 at 2:00AM CDT 

場合は、私のようなタイムスタンプを参照してください

私はInfluxDBでの測定のようにそれが表示されます-precisionのRFC3339を使用していることを確認した場合:

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 

最後の2つのサンプルは、上記少なくとも私に同じ番号を与えるように見えるが、それはInfluxDBが持っているものよりもはるかに短いです:

は例えば、私はいくつかの異なる方法を試してみました。私はそれが精度に関連していると仮定しています、InfluxDBは私が考えるナノ秒に物事をしますか?だから私は、余分な9 0の上で追加する必要が

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

:私は結果を用いてInfluxDBに測定を入力しようと

Python Result: 1491030000 
Influx Result: 1491030000000000000 

Pythonはそれとして示す終わる私を与えます。

これは、9つの0を結果に追加するのと同じくらい単純な場合、これをプログラムでPython内で行ういくつかの方法があると思います。しかし、1回の変換で同じ精度レベルを生成できないように見える理由を知りたいと思います。

私は単純に "4/1/17 2:00"という数多くの古いタイムスタンプを持つCSVファイルを持っています。毎日午前2時に測定値があります。

これらの古い測定値をすべて挿入するには、InfluxDBが "1491030000000000000"を必要とする適切なフォーマットに変換できる必要があります。

何が起こっているのかを理解し、Pythonでこれをプログラマチックに解決する方法よりも重要な点は何ですか。両方を行うことができる回答には感謝しますが、 「4/1/17 2:00」と表示されたタイムスタンプを含む1つの列でCSVを取得し、「1491030000000000000」と表示されるタイムスタンプに変換する方法に関するアイデアと同様に別のファイルまたは2番目の列に表示されます。

答えて

0

あなたの現在の問題を解決するには、このようなものが必要です。私はこれを試すためのテストCSVを持っていませんでしたが、おそらくあなたのために働くでしょう。これは、 "old.csv"がどこに置かれていても、何秒間のcsvファイルをとっても、ナノ秒単位のタイムスタンプを持つ第2のcsvを作成します。これは、あなたがこの問題でイライラ取得だけではありませんようにそれはそうthis読んだ後、何が起こっている理由として

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) 

。それはちょうどinfluxdbがちょうど別のタイプの精度を使用しているのと同じように、ほとんどのPythonモジュールと同じように思えます。残念なことに、日付変換の文字列操作を行うよりも、周りを回る方法は実際には見えませんでした。

0

InfluxDBは、Pythonのように、ナノ秒の精度をサポートしていないツール/ライブラリでより簡単に作業できるように、エポックタイムスタンプを2番目の精度で返すように指示できます。

これを有効にするには、クエリパラメータにepoch=sを設定します。

influx HTTP API timestamp format documentationを参照してください。