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

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

ただいまの
回答率

91.36%

  • Python 3.x

    2411questions

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

  • CSV

    389questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

  • pandas

    202questions

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

pythonでCSVファイルを、ユーザ入力で行・列指定について

解決済

回答 2

投稿 2017/11/21 15:10 ・編集 2017/11/21 15:56

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

bkts94441

score 9

実現したいこと

CSVファイルを読み込んだ後、B列とC列をユーザ入力で日付と時間を指定してX軸に、ユーザ入力でD列とE列に適切な値を入力してJ列以降のデータ列をY軸に当て、最後は以上の条件に当てはまったX軸,Y軸のグラフを出力させたい。

CSVファイル

列のラベルが横に崩れて見づらく申し訳ありません。
B列はDate,C列はClockTime
D列・E列はmotion_type・speed_setting
J列以降は sectionHoge_positionHoge_Hoge となっております。

      Date    ClockTime    motion_type    speed_setting    iteration    Temp1    Temp2    Temp3    section0_position1_count    section0_position1_mean    section0_position1_std    section0_position1_min
0    2017/8/24    00:00.0    0    0    0    0    0    0    14647    -32.32229169    23.8568587    -75.08892882
1    2017/8/24    00:00.0    0    0    1    0    0    0    14648    -32.39794386    23.90340666    -75.08891683
2    2017/8/24    00:00.0    0    0    2    0    0    0    14647    -31.66764895    23.44001228    -75.08892283
3    2017/8/24    00:00.0    0    0    3    0    0    0    14648    -31.29547116    23.19143941    -75.08892882
4    2017/8/24    00:00.0    0    0    4    0    0    0    14647    -32.21509856    23.79033633    -75.08892283
5    2017/8/24    00:00.0    0    0    5    0    0    0    14647    -34.13307802    24.88413157    -75.08891683

問題点

input()関数を使用してユーザ入力を試みましたが、入力した文字列・値とCSVファイルの照合が出来ませんでした。グラフの行列ラベルとユーザ入力で指定した文字列・数値を一致させる方法がわかりませんので、ご教授をお願い致します。

使用環境

Python3.X
Jupyter Notebook

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

df.locにて複数の列の値をand条件にて行を抽出する例です。
行の絞り条件をユーザーが入力するものと解釈しました。

なお、Date,ClockTimeについては日時として扱った方が範囲指定など利用しやすいため、その例も示しています。

import numpy as np
import pandas as pd
from io import StringIO

s = """
Nom    Date    ClockTime    motion_type    speed_setting    iteration    Temp1    Temp2    Temp3    section0_position1_count    section0_position1_mean    section0_position1_std    section0_position1_min
0    2017/8/24    00:00.0    0    0    0    0    0    0    14647    -32.32229169    23.8568587    -75.08892882
1    2017/8/24    01:00.0    1    0    1    0    0    0    14648    -32.39794386    23.90340666    -75.08891683
2    2017/8/24    12:00.0    0    1    2    0    0    0    14647    -31.66764895    23.44001228    -75.08892283
3    2017/8/24    23:00.0    0    0    3    0    0    0    14648    -31.29547116    23.19143941    -75.08892882
4    2017/8/25    00:00.0    1    0    4    0    0    0    14647    -32.21509856    23.79033633    -75.08892283
5    2017/8/25    00:00.0    0    1    5    0    0    0    14647    -34.13307802    24.88413157    -75.08891683
"""
df = pd.read_csv( StringIO(s), sep=" ", skipinitialspace=True)
#print(df)

# Date,ClockTimeは文字列、motion_type,speed_settingは数値として一致判定して行を抽出
inp_Date = '2017/8/24'
inp_ClockTime = '00:00.0'
inp_mt = 0
inp_ss = 0

df_sel = df.loc[(df['Date']==inp_Date) & (df['ClockTime']==inp_ClockTime) & (df['motion_type']==inp_mt) & (df['speed_setting']==inp_ss)]
print(df_sel[['Nom','Date','ClockTime','motion_type','speed_setting']])

# 日付と時刻を'DateTime'列にまとめ、日時の範囲で抽出

df['DateTime'] = pd.to_datetime( df['Date'] + ' ' + df['ClockTime'])

inp_date_st = pd.to_datetime('2017/8/24 01:00:00')
inp_date_ed = pd.to_datetime('2017/8/25 00:00:00')

df_sel = df.loc[(df['DateTime'] >= inp_date_st) & (df['DateTime'] < inp_date_ed)]
print(df_sel[['Nom','Date','ClockTime']])

投稿 2017/11/21 16:03

編集 2017/11/21 16:21

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/21 17:08

    ご回答ありがとうございます。記述されたプログラムを元に作成してみようと思います。

    キャンセル

+1

まず時間をまとめて、datetimeに変換します

入力した値をdatetimeオブジェクトとして処理できれば、後はマスクを作って抽出することができます。

import pandas as pd
import datetime

N = 10000
base = datetime.datetime.today().replace(microsecond=0)
date_list = [base - datetime.timedelta(hours=x) for x in range(0, N*5, 5)][::-1]
date_date = [str(d.date()) for d in date_list]
date_time = [str(d.time()) for d in date_list]
df = pd.DataFrame(columns=['Date', 'ClockTime', 'target'])
df['Date'] = date_date
df['ClockTime'] = date_time
df['target'] = np.random.rand(N)
print(df.head())
'''
         Date ClockTime    target
0  2012-03-09  13:22:15  0.525087
1  2012-03-09  18:22:15  0.242866
2  2012-03-09  23:22:15  0.720774
3  2012-03-10  04:22:15  0.168702
4  2012-03-10  09:22:15  0.216134
'''

tdf = df['Date'] + ' ' + df['ClockTime']
tdf = pd.to_datetime(tdf)
df['DateTime'] = tdf
print(df.head())
'''
         Date ClockTime    target            DateTime
0  2012-03-09  13:22:15  0.525087 2012-03-09 13:22:15
1  2012-03-09  18:22:15  0.242866 2012-03-09 18:22:15
2  2012-03-09  23:22:15  0.720774 2012-03-09 23:22:15
3  2012-03-10  04:22:15  0.168702 2012-03-10 04:22:15
4  2012-03-10  09:22:15  0.216134 2012-03-10 09:22:15
'''

mask = ((datetime.datetime.now() - 
         datetime.timedelta(days=10))< tdf) & (tdf < datetime.datetime.now())
print(df[mask].head())
'''
            Date ClockTime    target            DateTime
9952  2017-11-11  21:22:15  0.523548 2017-11-11 21:22:15
9953  2017-11-12  02:22:15  0.797870 2017-11-12 02:22:15
9954  2017-11-12  07:22:15  0.777698 2017-11-12 07:22:15
9955  2017-11-12  12:22:15  0.020755 2017-11-12 12:22:15
9956  2017-11-12  17:22:15  0.390619 2017-11-12 17:22:15
'''
print(df[mask].tail())
'''
            Date ClockTime    target            DateTime
9995  2017-11-20  20:23:27  0.419750 2017-11-20 20:23:27
9996  2017-11-21  01:23:27  0.738802 2017-11-21 01:23:27
9997  2017-11-21  06:23:27  0.113842 2017-11-21 06:23:27
9998  2017-11-21  11:23:27  0.025397 2017-11-21 11:23:27
9999  2017-11-21  16:23:27  0.361001 2017-11-21 16:23:27
'''

投稿 2017/11/21 16:24

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/21 17:11

    ご回答ありがとうございます。記述されたプログラム、ヒントを参考にプログラムを作成しようと思います。

    キャンセル

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

ただいまの回答率

91.36%

関連した質問

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

  • Python 3.x

    2411questions

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

  • CSV

    389questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

  • pandas

    202questions

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