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

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

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

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

Python

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

pandas

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

Q&A

解決済

2回答

1001閲覧

[Python]DataFrame,CSVデータの抽出における不具合

hellohello__

総合スコア1

CSV

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

Python

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

pandas

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

0グッド

0クリップ

投稿2021/12/26 15:12

前提・実現したいこと

python DataFrame操作中に不具合が発生しております.
外部のcsvファイルをDataFrameにインポートし,条件抽出で任意のデータを抽出したいのですがうまくいきません...
・指定しているpath,ファイル名は合っています.

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

getTemperature("2017040100")の返り値:  Series([], Name: 0, dtype: float64) 実行時のdf[df['time'] == time]自体は empty dataframe となっております.

該当のソースコード

Python

1import pandas as pd 2import csv 3import numpy as np 4 5def getTemperature(code): 6 year = str(code)[0:4] 7 month = str(code)[4:6] 8 date = str(code)[6:8] 9 hour = str(code)[8:10] 10 11 path = './weather/temp_' + year + '.csv' 12 df = pd.read_csv(path, header=4, names=["time", 0, 1, 2]) 13 14 time = year + '/' + str(int(month)) + '/' + str(int(date)) + ' ' + str(int(hour)) + ':00:00' 15 print(df[df['time'] == time]) 16 return df[df['time'] == time][0] 17 18getTemperature("2017040100")

試したこと

関数とは関係なく,単体で
=======================
df[["time"] == "2017/4/1 0:00:00"][0]
=======================
time = "2017/4/1 0:00:00"
df[["time"] == time][0]
=======================
と入力すると,正しいデータを出力してくれます.

補足情報(FW/ツールのバージョンなど)

==============================
↓読み込んでいるCSVファイル(気象庁の気温アーカイブです.)↓
==============================
ダウンロードした時刻:2021/12/26 19:14:33

,地域,地域,地域
年月日時,気温(℃),気温(℃),気温(℃)
,,品質情報,均質番号
2017/1/1 1:00:00,5.1,8,1
2017/1/1 2:00:00,5.5,8,1
2017/1/1 3:00:00,6.0,8,1
==============================
~(略)~
==============================
2017/3/31 22:00:00,6.4,8,1
2017/3/31 23:00:00,6.1,8,1
2017/4/1 00:00:00,6.0,8,1
2017/4/1 1:00:00,6.0,8,1
2017/4/1 2:00:00,6.0,8,1

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下では pandas.read_csv() で CSV ファイルを読み込む際に parse_dates を付けて、日時の文字列を datetime 型に変換しています。この様にすることで処理が簡単になりますので参考にしてみて下さい。

python

1import pandas as pd 2from datetime import datetime 3 4def getTemperature(df, time): 5 time = datetime.strptime(time, '%Y%m%d%H') 6 return df[df['time'] == time] 7 8if __name__ == '__main__': 9 path = './weather/temp_' + year + '.csv' 10 df = pd.read_csv(path, header=4, names=['time', 0, 1, 2], parse_dates=['time']) 11 temperature = getTemperature(df, '2017040100') 12 print(temperature) 13 14# 15 time 0 1 2 163 2017-04-01 6.0 8 1

投稿2021/12/26 15:58

編集2021/12/26 16:02
melian

総合スコア20655

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

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

0

CSVの中身は,

csv

12017/3/31 22:00:00,6.4,8,1 22017/3/31 23:00:00,6.1,8,1 32017/4/1 00:00:00,6.0,8,1 42017/4/1 1:00:00,6.0,8,1 52017/4/1 2:00:00,6.0,8,1

で,0時の時刻表現が2017/4/1 00:00:00で時刻表現が00と1~9時と比較して少し特殊になっています。

getTemperature("2017040100")だと,指定した時間文字列が
"00"0(数)→"0"となるので,
結局2017/4/1 0:00:00となり,この文字列が

'2017/4/1 0:00:00''2017/4/1 00:00:00'と判定して

検索に引っかからないということになっているのではと思います。

関数側で00に対応させるか,あらかじめデータフレーム内の
時刻文字列の時間を正規化(000)しておくかが対応策かと思います。

投稿2021/12/26 15:55

ujimushi_sradjp

総合スコア2152

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問