質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
InfluxDB

InfluxDBは、InfluxDataによって開発された時系列データベースです。オープンソースであり、Go言語で記述されています。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Q&A

2回答

1669閲覧

influxdb csv書き出し時のtimeをrfc3339形式にしたい。

Aya.0307.m

総合スコア2

InfluxDB

InfluxDBは、InfluxDataによって開発された時系列データベースです。オープンソースであり、Go言語で記述されています。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

0グッド

0クリップ

投稿2022/12/31 09:06

温度センサーを使用して温湿度のデータをラズパイに蓄積しています。
influxdbを使用し、グラファナに表示させています。
influxdbに蓄積したデータをcsvに書き出しました。
timeがナノタイム?になっていて、いつのデータかわかりません。rfc3339形式に変換して
読めるようにしたいです。
もしくはこれから蓄積されるデータをrfc3339
形式で登録したいです。
調べたのですが、よくわかりません。
丁寧に教えて頂けると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

データの登録方法次第だとは思うのですが、InfluxDBのデフォルトで登録した場合に、ナノ秒単位でタイムスタンプ情報が登録されているという状況でしょうか。

The timestamp for your data point in nanosecond-precision Unix time. The timestamp is optional in line protocol. If you do not specify a timestamp for your data point InfluxDB uses the server’s local nanosecond timestamp in UTC.

In the example, the timestamp is 1465839830100400200 (that’s 2016-06-13T17:43:50.1004002Z in RFC3339 format). The line protocol below is the same data point but without the timestamp. When InfluxDB writes it to the database it uses your server’s local timestamp instead of 2016-06-13T17:43:50.1004002Z.

もしスクリプトなどで変換可能であれば、RFC3339(or ISO8601)形式への変換処理を書いてみるのはいかがでしょうか。以下はPythonの一例です(マイクロ秒に丸まってしまいますが)。

python

1from datetime import datetime 2time_in_nano_second = 1465839830100400200 3time_in_second = time_in_nano_second / (1000 * 1000 * 1000) 4print(datetime.utcfromtimestamp(time_in_second).isoformat())

2016-06-13T17:43:50.100400

追記 (CSVの変換例)

InfluxDBのV1 APIとPython Scriptを使った場合の例を追記しておきます(あくまで簡易的なサンプルです)。なお、V2 APIの場合には、ISO形式で_time属性が出力されるようですし、telegrafのプラグインで変換するアプローチもあるようです。

InfluxDBへのダミーデータ登録

以下のコマンドを2回実行。

$ curl --request POST \ "http://localhost:8086/api/v2/write?org=sample-org-name&bucket=sample-bucket-name&precision=ns" \ --header "Authorization: Token $TOKEN" \ --header "Content-Type: text/plain; charset=utf-8" \ --header "Accept: application/json" \ --data-binary ' airSensors,sensor_id=TLM0201 temperature=73.97038159354763,humidity=35.23103248356096,co=0.48445310567793615 airSensors,sensor_id=TLM0202 temperature=75.30007505999716,humidity=35.651929918691714,co=0.5141876544505826 '

CSV形式でのエクスポート

$ curl 'http://127.0.0.1:8086/query?db=sample-bucket-1' \ --header "Authorization: Token $TOKEN" \ --header 'Accept: application/csv' \ --data-urlencode 'q=SELECT * FROM airSensors' > input.csv
$ cat input.csv name,tags,time,co,humidity,sensor_id,temperature airSensors,,1672645590018142521,0.48445310567793615,35.23103248356096,TLM0201,73.97038159354763 airSensors,,1672645590018142521,0.5141876544505826,35.651929918691714,TLM0202,75.30007505999716 airSensors,,1672645597434047671,0.48445310567793615,35.23103248356096,TLM0201,73.97038159354763 airSensors,,1672645597434047671,0.5141876544505826,35.651929918691714,TLM0202,75.30007505999716

カラム値の変換

timeカラムの情報からtime_in_iso_formatカラムを作成(UTC時間で出力されるため、日本時間とは9時間ズレます)。

$ python convert.py input.csv output.csv
$ cat output.csv name,tags,time,co,humidity,sensor_id,temperature,time_in_iso_format airSensors,,1672645590018142521,0.48445310567793615,35.23103248356096,TLM0201,73.97038159354763,2023-01-02T07:46:30.018142 airSensors,,1672645590018142521,0.5141876544505826,35.651929918691714,TLM0202,75.30007505999716,2023-01-02T07:46:30.018142 airSensors,,1672645597434047671,0.48445310567793615,35.23103248356096,TLM0201,73.97038159354763,2023-01-02T07:46:37.434048 airSensors,,1672645597434047671,0.5141876544505826,35.651929918691714,TLM0202,75.30007505999716,2023-01-02T07:46:37.434048

スクリプト(あくまで簡易的な例です)

python

1$ cat convert.py 2import csv 3from datetime import datetime 4import sys 5 6input_file = open(sys.argv[1], newline='') 7output_file = open(sys.argv[2], 'w', newline='') 8 9reader = csv.DictReader(input_file) 10new_fieldnames = reader.fieldnames + ['time_in_iso_format'] 11 12writer = csv.DictWriter(output_file, fieldnames=new_fieldnames) 13writer.writeheader() 14 15for row in reader: 16 time_in_nano_second = int(row['time']) 17 time_in_second = time_in_nano_second / (1000 * 1000 * 1000) 18 row['time_in_iso_format'] = datetime.utcfromtimestamp(time_in_second).isoformat() 19 20 writer.writerow(row)

投稿2023/01/01 02:08

編集2023/01/02 08:15
knuser

総合スコア178

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Aya.0307.m

2023/01/01 05:34

回答ありがとうございます。 おそらく、デフォルト登録で、ナノtimeなのだと思います。記録として取っておきたく、csvで書き出したいです。
knuser

2023/01/02 08:16

変換のサンプルを追記してみました。取得しようとされているデータに合わせて加工いただく必要があるとは思いますが、あくまで一例として、ご参考までに。
guest

0

ns 単位の時間なら、1000000000で割れば秒が出てきますが、そういうはなしかな?

具体的にどういう数値がでてくるんでしょうか

投稿2022/12/31 10:21

編集2022/12/31 10:22
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Aya.0307.m

2022/12/31 13:34

回答ありがとうございます。 手元に今データがないのですが、 20秒ごとに温度を観測してるのですが、 9桁くらいの数字で千か万の位の桁が増えていきます。 ちなみにラズパイのターミナル上やグラファナ上では何月の何時とはデータとしてわかります。
y_waiwai

2022/12/31 14:03

その実際のデータがわからんことには具体的なことはわからんですな。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問