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

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

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

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

pandas

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

Q&A

解決済

2回答

719閲覧

Pandas DFで、日時で検索し存在しない場合に存在する次の行を選択

666_paru

総合スコア20

Python

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

pandas

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

0グッド

0クリップ

投稿2020/09/19 10:23

編集2020/09/20 03:13

現在、以下のDFから日時の条件に一致する値を取得したいのですが、欠損しており取得できません。
欠損の場合に、次の行のデータを取得したいです。

python

1 index time open high low close 2101352 145494 2014-02-27 13:30:00+00:00 91.458 91.786 91.458 91.782 3101353 145495 2014-02-27 13:45:00+00:00 91.783 91.836 91.708 91.726 4101354 145504 2014-02-27 16:00:00+00:00 91.694 91.727 91.689 91.707 5101355 145505 2014-02-27 16:15:00+00:00 91.706 91.766 91.673 91.711 6......

検索のコードは以下です。

python

1time=2014-02-27T14:00:00.000000000 2 3print(type(time)) 4>><class 'numpy.datetime64'> 5 6rate = df[df.time == pd.to_datetime(time).strftime('%Y-%m-%d %H:%M:00.00')]["open"].values[0]

結果はSeries([], Name: open, dtype: float64)のため一致無しとなります。
この場合に、次の16時のopenのデータ(91.694)を取得したいです。

お分かりの方お教えいただきたく思います。
よろしくお願いいたします。

すみません。情報が不足していたため追記させて頂きます。
追記:
FXのバックテストを作成しており、2つの同じ構成のDFがあり、
DF1の2014年2月27日14:00の時間から、DF2の2014年2月27日14:15のデータを取得しようとしています。

timeに格納しているのは、以下のデータになります。
import dask.dataframe as dd
import pandas as pd

DF1 = dd.read_csv("DF1.csv", blocksize=None, encoding='UTF-8').compute()
DF1['time'] = pd.to_datetime(DF1['time'])
DF1 = DF1.set_index('time').resample(axis).agg(
{'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last', 'volume': 'sum'}).reset_index()

for idx in range(DF1.shape[0])
time=DF1["time"][idx:idx+1]
rate = df[df.time == pd.to_datetime(time).strftime('%Y-%m-%d %H:%M:00.00')]["open"].values[0]

再追記:
DF1tDF2では欠損の有無が違うため、インデックスは同じではないです。

例えば、
DF1には、インデックス:10の2014年2月27日10:00のデータがあっても、
DF2では2014年2月27日10:00のデータを持っていないため、インデックス10は2014年2月27日10:15のデータである
ということがあります。

その為、DF1のインデックスからDF2の同じインデックスを検索できないです。

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

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

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

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

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

toast-uz

2020/09/19 11:11

検索してエラーが出るコードをそのまま実行可能なものにしていただけますでしょうか。 time=2014-02-27T14:00:00.000000000 でエラーが出ます。
666_paru

2020/09/20 03:14

すみません 追記しました。 お分かりになりましたら教えてください。
guest

回答2

0

質問文における、検索コードの time=2014-02-27T14:00:00.000000000 の意味がわかりませんので、文字列としてのtimeをもとに、その値以上の最小の行を抜き出し、openの値を得るコードを示します。

Python

1time = '2014-02-27 14:00:00.00+00:00' 2df = df[df.time >= time] 3rate = df[df.time == df.time.min()].open.values[0]

投稿2020/09/19 11:48

toast-uz

総合スコア3266

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

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

666_paru

2020/09/20 03:16

情報不足ですみません。 追記させていただきました。 お分かりでしたら教え頂きたいです。
guest

0

ベストアンサー

python

1time = np.datetime64("2014-02-27T14:00:00.000000000") 2 3pos = pd.Index(df.time).get_loc(time, method="bfill") 4rate = df.iloc[pos, 2]

投稿2020/09/19 12:25

yymmt

総合スコア1615

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

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

toast-uz

2020/09/19 23:42

補足情報をあわせると、 time=DF1["time"][idx:idx+1].value[0] (.value[0]を追加) とした後に、こちらのpos以降のコードを当てはめれば、望む動作になると思います。
666_paru

2020/09/20 03:15

教えて頂きありがとうございます。 現在、すぐに手元で試せないため、帰宅後に動作確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問