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

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

ただいまの
回答率

91.04%

  • Python

    5186questions

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

  • Python 3.x

    3764questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • pandas

    331questions

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

【pandas】時間データをもとに1日の最高気温を求めたい

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 332

klang

score 14

時系列データをpandas.datetime型に変換して扱っています。

いま、データはA年B月C日D:00という状態になっています。また、datetimeの列とは別に、気温列(int)があります。

このデータから、日ごとの最高温度を求めたいです。

pd.resample()を使うとできるようなんですが、うまくいきません。

どのようにすれば、時間データから1日の最高温度を求めることができますか?

なお、回答はresample()を使うものでも、使わないものでも構いません。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

回答はresample()を使うものでも、使わないものでも構いません。

以下回答はresample()を使わないものになります。
以下リンクを参考に日毎の最高気温を求めてみました。参考にしてください。

import pandas as pd
import numpy as np
from pprint import pprint

rng = pd.date_range(start='2014-01-01', periods=10, freq='H')
# Temp列に0~10度をランダムに設定
df_original = pd.DataFrame(
    {'Temp': np.random.randint(0, 10, len(rng))}, index=rng)
pprint(rng)
"""
2014/01/01から1時間ごと午前9時までのインデックスを作成
DatetimeIndex(['2014-01-01 00:00:00', '2014-01-01 01:00:00',
               '2014-01-01 02:00:00', '2014-01-01 03:00:00',
               '2014-01-01 04:00:00', '2014-01-01 05:00:00',
               '2014-01-01 06:00:00', '2014-01-01 07:00:00',
               '2014-01-01 08:00:00', '2014-01-01 09:00:00'],
              dtype='datetime64[ns]', freq='H')
"""
pprint(df_original)
"""
                     Temp
2014-01-01 00:00:00     4
2014-01-01 01:00:00     8
2014-01-01 02:00:00     9
2014-01-01 03:00:00     6
2014-01-01 04:00:00     8
2014-01-01 05:00:00     3
2014-01-01 06:00:00     3
2014-01-01 07:00:00     9
2014-01-01 08:00:00     3
2014-01-01 09:00:00     7
"""
df_tmp = pd.DataFrame({'Temp': [0]},index=[df_original.index.shift(-1, freq='D')[0]])
# 日毎にデータをまとめて最大値を抽出
df_daily = df_tmp.append(df_original).groupby(pd.TimeGrouper(freq='D')).aggregate(np.max)[1:]
pprint(df_daily)
"""
            Temp
2014-01-01     9
"""


pandasのTimeGrouperで時系列の集計を便利に

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

時系列データがIndexなのであれば

df.resample('D').max()

で問題ないかと思います。

時系列データがIndex以外のColumnで使用しているのであれば、set_index() でIndexに設定後resample()するか

df.set_index('datetime').resample('D').max()

もしくは、groupby()使って

df.groupby(df['datetime'].dt.date).max()


のようにするとよいのではないでしょうか。

ということで、以下はサンプルコードです。

import pandas as pd
import numpy as np

N=36

# Indexが時系列データなの場合
df1 = pd.DataFrame(
    {'temp':np.random.randint(0, 28, N)},
    index=pd.date_range('2017/11/01 00:00', freq='2H', periods=N)
)

ret = df1.resample('D').max()
print(ret)


# Indexが時系列データでない場合
df2 = pd.DataFrame({
    'datetime':pd.date_range('2017/11/01 00:00', freq='2H', periods=N),
    'temp':np.random.randint(0, 28, N)
})

ret = df2.set_index('datetime').resample('D').max()
print(ret)

ret = df2.groupby(df2['datetime'].dt.date)['temp'].max()
print(ret)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

年月日単位で最大値を求めるのであれば、

Dataframe名.resample('d').max()

でよろしいかと思います。

1月1日分、2月1日分、などを1日分のデータとして最大値を求めるのであれば、日付データからdayを抽出してそれをキーに最大値を求めるという処理になるかと思います。

df_original['Day'] = [x.day for x in df_original['datetime']]
df_original.groupby('Day').max()['Temp']

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 91.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    5186questions

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

  • Python 3.x

    3764questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • pandas

    331questions

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