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

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

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

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

pandas

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

Q&A

解決済

1回答

707閲覧

python,pandas同士の部分一致

bkts94441

総合スコア18

Python 3.x

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

pandas

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

0グッド

1クリップ

投稿2018/10/30 04:59

編集2018/11/12 07:42

前提・実現したいこと

現在、機械の一定動作を記録する実験を行っており、計測データ.csvには実験動作のデータが記載されています。
また、計測データ.csvでデータをグラフ化しています。
日付毎に抽出された外れ値や計測失敗データをまとめた表をチェックリスト.xlsxとして作成しました。
次に、チェック対象データを予め分かりやすくするため、チェック対象の日付を違う色で出力することを試みています。

計測データ.csv

Unnamed: 0 DateTime Operated cycles hdtemp \ 1 1 2018-03-08 19:53:38.590 -2224389.0 0.0 36 36 2018-03-09 18:19:22.260 -2205153.0 32.1 133 133 2018-03-16 14:02:03.760 -1965408.0 56.8 242 242 2018-03-17 02:02:08.130 -1929389.0 58.9 336 336 2018-03-17 14:02:07.820 -1893374.0 58.7 ... ... ... ... 6114 6114 2018-04-16 14:02:10.810 -79607.0 40.6 6201 6201 2018-04-17 02:02:11.640 -63454.0 51.6 6295 6295 2018-04-17 14:02:15.340 -43630.0 49.3 6390 6390 2018-04-18 02:02:12.070 -23799.0 53.2 6485 6485 2018-04-18 14:02:15.750 -3975.0 50.9 count_velocity mean_velocity 1 3287.0 104.510044 36 3286.0 104.511719 133 3289.0 104.595172 242 3290.0 104.485199 336 3292.0 104.495872 ... ... 6114 3280.0 104.503950 6201 3279.0 104.501253 6295 3280.0 104.500587 6390 3268.0 104.511174 6485 3296.0 104.493659

外れ値チェックリスト.xlsx

Date sampleA 8 2018-03-09 not 15 2018-03-16 not 16 2018-03-17 not 17 2018-03-18 not 18 2018-03-19 not ... ... ... 14 2018-04-15 not 15 2018-04-16 not 16 2018-04-17 not 17 2018-04-18 not 18 2018-04-19 not

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

グラフ出力する際、計測データ.csvのX軸を"Operated cycles列",
Y軸を"mean_velocity列" 又は"count_velocity列" に設定してグラフを出力しています。
今回行いたいことは、計測データ.csvの"DateTime列"と外れ値チェックリスト.xlsxの"Date列"の日付が同じ月日であれば"Date列"と"DateTime列"が一致する日付の行へとdataframeを結合させたいのですがどのようにすればよろしいでしょうか。

質問追記 2018/11/12

変更後,外れ値チェックリスト.xlsx

Date sampleA 1 2018-03-08 19:12:22 NaN 36 2018-03-09 18:20:30 ok 133 2018-03-10 14:00:00 ok 242 2018-03-10 02:02:11 empty 336 2018-03-11 14:00:00 ok .. ... ... 6114 2018-04-17 14:20:31 ok 6201 2018-04-18 02:00:00 ok 6295 2018-04-18 14:03:02 ok 6390 2018-04-19 02:00:00 ok 6485 2018-04-19 14:20:30 ok

上記のチェックリスト.xlsxファイルの仕様が変更し、時刻を追加することになりました。
時刻が2時台と14時台は問題無く計測出来ていると判断していますが、稀に他の時間帯で計測しているデータがあります。また、2時台と14時台の時刻が完全に一致していないこともあり、計測データ.csvをdf["DateTime"].dt.hourで時間のみ抽出して結合を試みて、series型で返ってきた"DateTime"を再度結合してからもう一度DataFrame化をしたら下記のようになりました。どうにかして分秒を除いて時間のみでpd.mergeを行いたいのですが何か良い方法はありますでしょうか。再度質問をして恐れ入りますがご回答よろしくお願い致します。

DateTime Operated cycles sampleA 1 1970-01-01 00:00:00.000000019 -2224389.0 6.809720 36 1970-01-01 00:00:00.000000018 -2205153.0 9.529389 133 1970-01-01 00:00:00.000000014 -1965408.0 4.865321 242 1970-01-01 00:00:00.000000002 -1929389.0 3.787791 336 1970-01-01 00:00:00.000000014 -1893374.0 6.848335 432 1970-01-01 00:00:00.000000002 -1857366.0 7.682003 528 1970-01-01 00:00:00.000000014 -1821352.0 5.676905 624 1970-01-01 00:00:00.000000002 -1785344.0 8.802663

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

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

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

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

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

coco_bauer

2018/10/30 05:21

質問の内容が理解できません。 "計測データ.csv"は、何らかの計測データが入っているCSVファイル。"チェックリスト.xlsx"は、除外すべきデータに関するデータが入っているExcelファイル。ここまでは分かるのですが、これらのファイルにどんなデータが含まれているのか、"結合"というのは何をすることなのか、突然出てきた"出力データ.csv"とは何か、「日付を部分一致などで」の"など"は何を含むのか、といった部分が理解できません。
bkts94441

2018/10/30 05:23

説明不足で申し訳ございません、訂正致します。
guest

回答1

0

ベストアンサー

計測データの DateTime列より Date列 を生成し、2つのDataFrameを Date列にて結合(pd.merge())すると良いかと思います

以下、サンプル(データはかなり簡略化されております)

Python

1import pandas as pd 2 3# 計測データ (DateTime列はDatetime型) 4dfA = pd.DataFrame({ 5 'DateTime': ['2018-03-08 19:53:38.590', 6 '2018-03-09 18:19:22.260', 7 '2018-03-16 14:02:03.760'], 8 'Operated cycles': [-2224389.0,-2205153.0,-1965408.0], 9 'hdtemp': [0.0, 32.1,56.8]}) 10dfA['DateTime'] = pd.to_datetime(dfA['DateTime']) 11 12# 外れ値リスト (Date列はDatetime型) 13dfB = pd.DataFrame({ 14 'Date' : ['2018-03-09', '2018-03-16', '2018-03-17'], 15 'sampleA' : ['not', 'not', 'not'] 16}) 17dfB['Date'] = pd.to_datetime(dfB['Date']) 18 19 20# DfA に Date列を追加(DateTime列より生成) 21dfA['Date'] = dfA['DateTime'].dt.normalize() 22# DfA と DfB を Date列にて結合 23ret = pd.merge(dfA, dfB, on='Date', how='left') 24print(ret) 25# DateTime Operated cycles hdtemp Date sampleA 26#0 2018-03-08 19:53:38.590 -2224389.0 0.0 2018-03-08 NaN 27#1 2018-03-09 18:19:22.260 -2205153.0 32.1 2018-03-09 not 28#2 2018-03-16 14:02:03.760 -1965408.0 56.8 2018-03-16 not

投稿2018/10/30 08:47

magichan

総合スコア15898

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

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

bkts94441

2018/10/31 00:27

magichanさん DateTime型で時刻設定して結合を行えば、ご回答いただいた事が出来たのですね。 ご回答いただいた記述を元に無事に求めていたことが出来て感謝しています。ありがとうございました。
bkts94441

2018/11/12 06:44

申し訳ございません。追記で質問があります。 追記として記載致します。
magichan

2018/11/12 11:48

df['Date'] = df['Date'].apply(lambda dt: dt.replace(minute=0, second=0)) で、時・分を0にできるかと思いますがどうでしょうか
bkts94441

2018/11/13 01:13

返事が遅れてしまい申し訳ございません。ご回答いただいた通り実行してみたら理想通りの結果が出力されました。再びご回答いただき感謝しております。
bkts94441

2018/11/13 05:31

何度も申し訳ございません。つかぬ事をお伺いいたしますが、チェックリスト.xlsxの仕様上、計測ミスの時間が12時以内の時間帯を(hour=2)、13時以上24時以内の時間帯を(hour=14)と置換するべく、条件分岐の方法を調べていたのですがpandasでのdatetimeの条件分岐を調べてもわからなかったので、差支えなければ教えていただけないでしょうか。申し訳ございませんがよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問