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

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

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

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

Q&A

解決済

1回答

519閲覧

pythonで時系列データを補完したい

edcba12345

総合スコア5

Python

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

0グッド

0クリップ

投稿2023/01/05 06:08

編集2023/01/05 10:45

前提

時系列データの時間を補完したうえで、補完した部分の値に0をいれたいです。python初心者ですがご教授お願いいたします。

実現したいこと

time
4.080e+01 5.542e+00
7.480e+01 5.747e+00
1.397e+02 4.512e+00
1.576e+02 4.742e+00
2.466e+02 4.516e+00
2.872e+02 6.748e+00
3.883e+02 3.941e+00
4.178e+02 3.952e+00
4.826e+02 5.009e+00
5.303e+02 5.378e+00
5.881e+02 5.258e+00
6.388e+02 5.120e+00
6.894e+02 4.601e+00
8.230e+02 4.447e+00
9.669e+02 3.940e+00
2.767e+03 4.139e+00
2.903e+03 5.377e+00
3.064e+03 4.023e+00
3.114e+03 4.015e+00
3.142e+03 3.980e+00
3.195e+03 4.963e+00
3.213e+03 5.100e+00
3.224e+03 4.945e+00
3.361e+03 3.923e+00
3.491e+03 8.485e+00
3.524e+03 5.919e+00
3.559e+03 5.394e+00

このような時系列のデータフレームがあり、timeを0から3600まで0.05刻みに補完したうえで、右列に0を追加したいです。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "C:/新しいフォルダー/南大西洋2015081700/c.py", line 224, in <module> simple_check(ROOT_PATH) File "C:/新しいフォルダー/南大西洋2015081700/c.py", line 77, in simple_check n=len(time_list[i])/0.05 IndexError: arrays used as indices must be of integer (or boolean) type

該当のソースコード

python

1import pandas as pd 2import numpy as np 3 4sec=np.arange(40, 41, 0.05) 5rn=np.zeros(21) 6list3 = [ item for pair in zip(sec, rn) for item in pair] 7#print(list3) 8list3 = np.array(list3).reshape(-1, 2) 9print(list3) 10 11time_list = [4.080e+01, 5.542e+00] 12for d, f in zip(time_list,list3): 13 if (time_list[d][0]==list3[f][0]): 14 time_list[d][1]=list3[f][1]

試したこと

実現したいことから簡略化しました。40~41秒の0.05秒刻みのリストと0を並べてリストを結合させ、time_listの40.8秒時の値が置換できるかどうか試してみましたがうまくいきませんでした。ご教授お願いいたします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

yuma.inaura

2023/01/05 06:19

今のコードを載せておきませんか?
meg_

2023/01/05 10:29

> IndexError: arrays used as indices must be of integer (or boolean) type 上記エラーはどの行で発生したのでしょうか? エラーメッセージは省略されると第三者には分かりずらくなります。
guest

回答1

0

ベストアンサー

0 から 3600 まで 0.05 刻みの値を持つデータフレームを作成、元のデータフレームと連結して重複を削除。重複処理の際に float の比較では丸め誤差が問題になるので、1000 倍にして整数値(int)にしておくなど。

python

1import pandas as pd 2import numpy as np 3import io 4 5csv_data = ''' 6time,value 74.080e+01,5.542e+00 87.480e+01,5.747e+00 91.397e+02,4.512e+00 101.576e+02,4.742e+00 112.466e+02,4.516e+00 122.872e+02,6.748e+00 133.883e+02,3.941e+00 144.178e+02,3.952e+00 154.826e+02,5.009e+00 165.303e+02,5.378e+00 175.881e+02,5.258e+00 186.388e+02,5.120e+00 196.894e+02,4.601e+00 208.230e+02,4.447e+00 219.669e+02,3.940e+00 222.767e+03,4.139e+00 232.903e+03,5.377e+00 243.064e+03,4.023e+00 253.114e+03,4.015e+00 263.142e+03,3.980e+00 273.195e+03,4.963e+00 283.213e+03,5.100e+00 293.224e+03,4.945e+00 303.361e+03,3.923e+00 313.491e+03,8.485e+00 323.524e+03,5.919e+00 333.559e+03,5.394e+00 34''' 35df = pd.read_csv(io.StringIO(csv_data)) 36 37# 38N = int(3600/0.05) 39df_a = pd.DataFrame({ 40 'time': np.linspace(0, 3600, N+1), 41 'value': 0, 42}) 43 44dfx = pd.concat([df, df_a]) 45dfx = dfx[~dfx.assign(_time=(dfx['time']*1000).astype(int)).duplicated('_time')].sort_values('time') 46 47print(dfx) 48print(dfx[dfx['time'] == 40.80]) 49print(dfx[dfx['time'] == 3.559e+03]) 50print(dfx[dfx['time'] == 3.883e+02])

投稿2023/01/05 11:09

melian

総合スコア19701

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

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

edcba12345

2023/01/10 15:25

遅くなりましたが、こちらの回答で解決しました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問