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

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

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

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

Q&A

解決済

2回答

2626閲覧

csvファイルの読み取り

ketchup

総合スコア7

Python

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

0グッド

0クリップ

投稿2017/10/11 10:04

###前提・実現したいこと
初めましてプログラムをはじめて間もないのですが、
現在csvファイルからデータを読み込みグラフを表示するプログラムを作っています。
csvは以下ののようになっています。(ファイル名は "日付".csv)

7:00 56.7
7:01 56.5
: :
: :
10:00 50.1

###発生している問題・エラーメッセージ
グラフは問題なく表示できるのですがX軸が時間表示されません。
データの個数で表示されているようです。
これを時間に修正したいのですが、よくわかりません。

###該当のソースコード
#!/usr/bin /env python
import matplotlib.pyplot as plt
import pandas as pd
import datetime

d = datetime.datetime.today()
ymd = d.strftime("%Y%m%d")

A=pd.read_csv("/var/www/tempX/"+ymd+"b.csv")

plt.figure(figsize=(8,5))
plt.plot(maker="o")
plt.clf()
plt.title("A Line Temperature")
plt.xlabel("time")
plt.ylabel("temp")
plt.ylim([30,70])
plt.plot(A.T.values[1])

plt.show
plt.savefig(ymd+"B.png")

###試したこと

###補足情報(言語/FW/ツール等のバージョンなど)
python2で実行

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

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

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

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

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

guest

回答2

0

ベストアンサー

3点ほど。

1. pandasにてCSVデータを読み込む際に、0行目のデータを時系列データとして読み込んでください。
やり方としては、read_csv()の引数に parse_dates=[0]を記述するだけで時系列データとして読み込めると思います。

Python

1A=pd.read_csv("/var/www/tempX/"+ymd+"b.csv", header=None, sep=' ', parse_dates=[0]) 2print(A.head()) 3# => 0 1 4# 0 2017-10-12 07:00:00 56.7 5# 1 2017-10-12 07:01:00 56.5 6# 2 2017-10-12 07:02:00 56.5 7# 3 2017-10-12 07:03:00 56.5 8# 4 2017-10-12 07:04:00 56.5 9 10print(A[0].dtype) 11# => datetime64[ns]

質問文のデータ形式に合わせて、上のコードでは セパレータをスペース(sep=' ')、ヘッダー部を無し(header=None) を指定しております。

2. plot()の引数にはXデータとYデータの両方を渡してください。
Yデータのみを渡すと、X軸は自動的に 0からのカウントデータになってしまいますので、X軸には上記で設定した1列目の時系列データを渡してください
あと細かいですが、

  • A.T.values[1]A[1] でOK
  • marker = 'o' は データを渡すときに一緒に記述する

です。

Python

1# コレを 2# plt.plot(A.T.values[1]) 3# ↓に修正 4plt.plot(A[0], A[1], marker='o')

3.
時系列データをプロットすると軸の区切り間隔がおかしくなりますので、X軸に時系列用のlocatorを設定してください。
また、時刻ラベルのフォーマットを時系列用の formatter にて併せて設定しておくと良いかと思います。

https://matplotlib.org/api/dates_api.html

例えば、今回の場合は区切り間隔を1時間毎にすると適当かと思いますので、
locatorとして mdates.HourLocator()を設定します。
またこの際に、formatterDateFormatter('%H:%M') しておくとよいでしょう。

以上をまとめるとこんな感じになるかと思います。

Python

1import matplotlib.pyplot as plt 2import matplotlib.dates as mdates 3import pandas as pd 4import datetime 5 6d = datetime.datetime.today() 7ymd = d.strftime("%Y%m%d") 8 9A=pd.read_csv("/var/www/tempX/"+ymd+"b.csv", header=None, sep=' ', parse_dates=[0]) 10 11fig = plt.figure(figsize=(8,5)) 12ax = fig.add_subplot(111) 13ax.set_title("A Line Temperature") 14ax.set_xlabel("time") 15ax.set_ylabel("temp") 16ax.set_ylim([30,70]) 17# 1時間毎に目盛り追加(Major) 18ax.xaxis.set_major_locator(mdates.HourLocator()) 19ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M')) 20# 10分ごとの目盛り追加(Mitor) 21ax.xaxis.set_minor_locator(mdates.MinuteLocator([10,20,30,40,50])) 22ax.plot(A[0],A[1], marker='o') 23 24plt.show() 25plt.savefig(ymd+"B.png")

投稿2017/10/12 00:48

magichan

総合スコア15898

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

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

ketchup

2017/10/12 14:32

なるほど、なんとなくイメージができました。 ありがとうございました。
guest

0

Pandas も matplotlib も使ったことがないので変なことをしていたらすみませんが、公式サンプルを見ると set_major_formatter() を使うと軸の書式を設定できるようです。

また Pandas にデータを取り込む際、第1カラムをヘッダかつ時刻データであることを定義して意味を持たせる方が、今後データを扱う上でなにかと便利だと思います。

python

1from matplotlib.dates import DateFormatter 2from matplotlib import pyplot as plt 3import pandas as pd 4 5 6A = pd.read_csv( 7 '20171011b.csv', header=None, 8 names=['Time', 'Temperature'], index_col='Time', parse_dates=True) 9 10ax = plt.subplot() 11ax.set_title("A Line Temperature") 12ax.set_xlabel("time") 13ax.xaxis.set_major_formatter(DateFormatter('%H:%M')) 14ax.set_ylabel("temp") 15ax.set_ylim(30, 70) 16ax.plot(A) 17plt.show()

投稿2017/10/11 13:56

miyahan

総合スコア3095

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

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

ketchup

2017/10/12 14:34

なるほど、シンプルな表現でできるのですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問