1timeseries
年間に3つの異なるセンサーからのデータがあります。センサーは、およそ3分ごとにデータポイントを生成します。センサーは同期されていないため、相互に異なる時間にデータポイント出力を生成します。
このデータは、約50万レコードの1つのテーブルのsqliteデータベースにあります。javascriptチャートライブラリdygraphを使用してこのデータを表示するつもりですtimeseries
。センサー名でSQLクエリを実行し、csvに保存することで、これらのセンサーごとにチャートを個別に作成しました。各センサーを表す線で、すべてのデータポイントを表示する1つのグラフが必要です。
'minutes_array'というタイプの文字列のnumpy2d配列を作成しました。最初の列は、センサーの時系列の開始から終了まで1分ごとに最も近い分に丸められたunixタイムスタンプであり、それぞれからのデータで埋められる3つの空の列があります。利用可能な場合は3つのセンサーのうち。
minutes_array
[['1316275620' '' '' '']
['1316275680' '' '' '']
['1316275740' '' '' '']
...,
['1343206920' '' '' '']
['1343206980' '' '' '']
['1343207040' '' '' '']]
次に、センサーの時系列データも最も近い分に丸められます。numpy.in1dを使用して、上記の「minutes_array」および「sensor_data」配列からタイムスタンプを取得し、そのセンサーに関連するレコードのマスクを作成します。
Sensor_data
[['1316275680' '215.2']
['1316275860' '227.0']
['1316276280' '212.2']
...,
['1343206380' '187.7']
['1343206620' '189.4']
['1343206980' '192.9']]
mask = np.in1d(minutes_array[:,0], sensor_data[:,0])
[False True False ..., False True False]
次に、そのマスクに当てはまるminutes_arrayのレコードを変更し、sensor_data値をminutes_arrayのタイムスタンプに続く最初の列に配置します。私の試みから、マスクが適用されたときに元の「minutes_array」を変更することは不可能のようですが、forループを使用せず、タイムスタンプを個別に一致させることなく、numpyでこの結果を達成する方法はありますか?
解決しました
@eumiroからの以下の回答に基づいて、PandasDocsのソリューションと上記の「sensor_data」numpy配列を使用しました
sensors = ['s1','s2','s3']
sensor_results = {}
for sensor in sensors:
sensor_data = get_array(db_cursor, sensor)
sensor_results[sensor] = pd.Series(sensor_data[:,1], \
index=sensor_data[:,0])
df = pd.DataFrame(buoy_results)
df.to_csv("output.csv")