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

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

ただいまの
回答率

90.77%

  • Python

    6904questions

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

  • NumPy

    382questions

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

DataFrameの中から指定した範囲の日時を取り出したい

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 109

k0908

score 51

DataFrameの中から指定した範囲の日時を取り出したい。
data変数に、

NAME AGE            DATETIME  
Tom   36  2012-01-01 03:19:38   
Bob   29  2015-12-16 17:32:40
・
・
・
John  65  2014-11-21 04:16:37


という風にDataFrame型のデータが入っている。

start = "2010-05-27 13:46:27"
end = "2014-03-28 07:14:18"


と今start・end変数に文字列で日時が入っている。
start変数〜end変数の日時の間でdata変数のDATETIME カラムの中身を古いもの順に並び替えたい。
理想のアウトプットは、

NAME AGE            DATETIME  
Lucy   13  2010-06-01 04:38:49   
Kei   53  2010-08-23 17:17:24
・
・
・
Emma  47  2014-03-25 09:39:59


のように出すことである。

np.sort(data, order=['DATETIME'])


とコードを書いてDATETIMEごとにsortしようとしたがstart変数〜end変数の日時の間をどうやって絞ればいいかわからなかった。
どのようにコードを書けばそれが実現できるか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+2

とりあえず値の型はおいといて、絞ってsortするコード例です。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(20)[::-1].reshape(10,2))
print(df)
"""
    0   1
0  19  18
1  17  16
2  15  14
3  13  12
4  11  10
5   9   8
6   7   6
7   5   4
8   3   2
9   1   0
"""
df = df[(df[1] > 5) & (df[1] < 10)].sort_values(1).reset_index(drop=True)
print(df)
"""
   0  1
0  7  6
1  9  8
"""

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/21 23:28 編集

    そういえばSeriesの論理積は&でしたね・・・
    5 < df[1]< 10とか(5 < df[1]) and (df[1] < 10)とか試してダメだったので諦めてapplyで書いちゃいました

    キャンセル

  • 2018/05/21 23:32

    and が×で & が○というのは分かりにくい。。。けど、つい違う回答したくなる(^^;
    「~.apply(lambda~」のほうが汎用性あってよいと思います~

    キャンセル

checkベストアンサー

+1

Datetime を扱うというのであれば、Indexに設定して df[start:end] のように処理するという方法もありかと思います。

import pandas as pd
import io

# 適当に生成したデータ
data = io.StringIO("""NAME,SEX,DATETIME,AGE
DoiTadao,M,2009/04/26 10:14,49
KawadaToshio,M,2012/01/14 10:29,23
HamaguchiBunichi,M,2013/08/29 10:33,54
TakedaShizue,F,2008/11/13 10:42,39
SudaMana,F,2015/06/26 10:01,54
DoiYasuo,M,2013/05/19 10:00,44
YatsutaMasahiro,M,2011/08/04 10:55,47
MorishitaKaoru,F,2016/12/15 10:44,45
YazakiToshiaki,M,2015/09/21 10:34,23
OonukiHonoka,F,2014/04/19 10:00,43
""")
df = pd.read_csv(data, parse_dates=['DATETIME'])

# 'DATETIME'列をIndexにしてソートする
df = df.set_index('DATETIME').sort_index()

start = "2012-01-14 10:30:00"
end = "2015-06-26 10:00:00"

# 範囲指定が楽
print(df[start:end])
#                                 NAME SEX  AGE
#DATETIME
#2013-05-19 10:00:00          DoiYasuo   M   44
#2013-08-29 10:33:00  HamaguchiBunichi   M   54
#2014-04-19 10:00:00      OonukiHonoka   F   43

# 必用であれば reset_index()でIndex指定をやめる
print(df[start:end].reset_index())
#             DATETIME              NAME SEX  AGE
#0 2013-05-19 10:00:00          DoiYasuo   M   44
#1 2013-08-29 10:33:00  HamaguchiBunichi   M   54
#2 2014-04-19 10:00:00      OonukiHonoka   F   43

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

とりあえず、こんな感じでできませんか。

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame(np.arange(20).reshape(10,2))
>>> df
    0   1
0   0   1
1   2   3
2   4   5
3   6   7
4   8   9
5  10  11
6  12  13
7  14  15
8  16  17
9  18  19
>>> df[df[1].apply(lambda x: 5 < x < 10)]
   0  1
3  6  7
4  8  9

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • Python

    6904questions

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

  • NumPy

    382questions

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