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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

Q&A

解決済

1回答

2216閲覧

[scipy-interpolate]時間情報と座標データに対して一秒ごとのデータに補間したい

oinari03

総合スコア59

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

0グッド

0クリップ

投稿2020/11/05 09:13

編集2020/11/05 09:14

やりたいこと

以下のように時間情報の入った配列と、データが入った配列があります。
それらを時間に対応したデータがバラバラなので、一秒ごとに補間したデータが欲しいと考えています。
そのためにscipyのinterpolateを使えば補間できそうだと考えてやろうとしています。
時間情報とx座標は対応しています。時間は重複してませんが、xは重複している可能性もあります。
timeには文字列でデータがはいっています。
xはtimeに対応したデータです。

time = np.array(['2020-06-01 00:07:42','2020-06-01 00:28:12','2020-06-01',.....,'2020-06-30 23:54:01']) x = np.array([434618.787368,434618.781857,434612.078263 ,.....,434144.253173)]

これを補間して、一秒ごとのデータを取り出したいです。

やってみたこと

実際のデータではないですが、補間そのものをしてみようとミニマムなコードを書いてみました。
しかし、今回の時間データに対して一秒ごとのデータを取り出す方法がわかりません。

以下、まったく違うデータでの補間のコード

# interpolate:補間をしてくれる関数 import numpy as np from scipy import interpolate import matplotlib.pyplot as plt x = np.array([0,22,33,44,50,60,75,86,99,107,128,199,220]) y = np.array([0,33,53,34,55,44,45,31,14,33,63,18,96]) # 最小帝から最大値までの等間隔に100pointつくる # x座標を作る x_latent = np.linspace(min(x), max(x),100) f = interpolate.interp1d(x,y) y_latent = f(x_latent) plt.scatter(x,y,label="point") plt.plot(x_latent, y_latent, c= "red", label="fitted") plt.grid() plt.legend() plt.show()

イメージ説明

これは全く関係ないデータなのでうまくいくコードになっていないのと、一秒ごとのデータを取り出すということがわからなくてできてません。

### 最後に

やりたいことで書いている通りではありますが、今回のデータに対して補間することで一秒ごとにデータを取り出す方法を教ええていただきたいと思います。

どうかよろしくお願いします。

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

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

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

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

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

meg_

2020/11/05 11:00

> これは全く関係ないデータなのでうまくいくコードになっていない どういうグラフになることを想定していたのでしょうか?
oinari03

2020/11/05 12:38

グラフとして表示させたのは、今回とは違うが2つのデータによって補間することは出来たというのを示すためでして、本来はグラフから補間した際のデータを取り出すことが目的です。X軸を今回のデータ(文字列ですが)の時間で1秒事に切り分けてそれに対応した=補間した(配列のデータ)を取り出せないか考えています。 説明下手ですみません。
oinari03

2020/11/05 12:40

ここでは等間隔に100ポイント作っていますが、等間隔が1秒間隔になるようにしたいです
meg_

2020/11/05 13:01

時系列データであればpandasを使うのが良いかもしれません。※scipy.interpolateについては知らないので私ならpandasを使うという意味です。
guest

回答1

0

ベストアンサー

1秒ごとの配列を作るのは、numpy.arangeでできます。

python

1import numpy as np 2 3np.arange('2020-06-01 00:07:42', '2020-06-30 23:54:01', np.timedelta64(1, 's'), dtype='datetime64[s]')

oinari03さんのコードで使うなら、こんな感じでしょうか。

python

1import numpy as np 2 3time = np.array(['2020-06-01 00:07:42', '2020-06-01 00:28:12', '2020-06-30 23:54:01']) 4 5time = time.astype('datetime64[s]') # 文字列型を、datetime64型(秒単位)に変換 6 7time_latent = np.arange(min(time), max(time) + 1) 8# 省略しないで書くならこんな感じ 9# time_latent = np.arange(min(time), max(time) + np.timedelta64(1, 's'), np.timedelta64(1, 's'))

ただし、scipy.interpolate.interp1dはdatetime64型では動いてくれないので、int等に変換して計算する必要があります。(EPOCH時間になるようです)

python

1import numpy as np 2from scipy import interpolate 3 4time = np.array(['2020-06-01 00:07:42', '2020-06-01 00:28:12', '2020-06-30 23:54:01']) 5x = np.array([434618.787368, 434618.781857, 434144.253173]) 6 7time = time.astype('datetime64[s]') 8 9time_latent = np.arange(min(time), max(time) + 1) 10 11f = interpolate.interp1d(time.astype('int'), x) 12x_latent = f(time_latent.astype('int'))

投稿2020/11/06 01:48

編集2020/11/06 01:57
bsdfan

総合スコア4794

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

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

oinari03

2020/11/06 02:01

ありがとうございます!! すごくわかりやすくて参考にさせていただきます!!!
oinari03

2020/11/06 02:28 編集

問題なく作動したんですが、一部疑問としてtime_latentを表示させたときに空白がTでおおわれてしまったのはどうしたらいいでしょうか? ['2020-06-01T00:07:42' '2020-06-01T00:07:43' '2020-06-01T00:07:44' '2020-06-01T00:07:45' '2020-06-01T00:07:46' '2020-06-01T00:07:47' '2020-06-01T00:07:48' '2020-06-01T00:07:49' '2020-06-01T00:07:50' '2020-06-01T00:07:51' '2020-06-01T00:07:52']
bsdfan

2020/11/06 02:57

numpyのdatetime64型を文字列として表示するときのフォーマットがそうなっているようで、変更する方法はなさそうです。strftimeのような文字列として整形する機能もnumpyとしては用意されていないです。このあたりはnumpyは計算に特化しているということかもしれないです。 表示方法をさわりたくなったら、そこの部分はpandasを使うほうがいいかもしれません。
oinari03

2020/11/06 03:42

なるほどです。 pandasのデータフレームに突っ込んで表示させてみたらTはなくなっていました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問