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

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

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

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

Q&A

解決済

1回答

2201閲覧

txtから読み込んでdatetimeをもちいて時系列データを可視化したい

Kamal_kobu

総合スコア1

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

0グッド

0クリップ

投稿2020/08/02 14:51

前提・実現したいこと

txt fileに日付と値を保存してそれを呼び出して新しく値を追加して、グラフ化したい。
日付は連続的ではない可能性があるためstrではなくdatetime.date形式からplotしたい
Matplotlibで間隔が疎らな時系列データを可視化する
上記を参考にしました。

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

ValueError: DateFormatter found a value of x=0, which is an illegal date. This usually occurs because you have not informed the axis that it is plotting dates, e.g., with ax.xaxis_date()

該当のソースコード

python3

1import datetime 2import numpy as np 3import matplotlib.pyplot as plt 4 5path_date = 'BodyWeight_date.txt' 6path_coins = 'BodyWeight_weight.txt' 7 8def add_data(coins): 9 with open(path_date) as f: 10 date_list = [s.strip() for s in f.readlines()] 11 date_list = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in date_list] 12 date_list = [datetime.date(date.year, date.month, date.day)for date in date_list] 13 date_list.append(datetime.date.today()) 14 15 with open(path_coins) as f: 16 coins_list = [float(s.strip()) for s in f.readlines()] 17 18 coins_list.append(coins) 19 print(type(date_list[0])) 20 print(date_list) 21 print(coins_list) 22 23 24 with open(path_date, mode='w') as f: 25 date_list = [str(t) for t in date_list] 26 f.write('\n'.join(date_list)) 27 with open(path_coins, mode='w') as f: 28 coins_list = [str(i) for i in coins_list] 29 f.write('\n'.join(coins_list)) 30 31 ax = plt.subplot() 32 ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d')) 33 ax.plot(date_list,coins_list) 34 plt.show() 35 36# plt.xticks(rotation=70) 37# plt.plot(date_list, coins_list) 38# plt.show()

最後の4行の代わりにコメントアウトした3行を使うとエラーは出ませんが表示間隔が時間通りにならず,欲しいグラフをプロットできません。(str型ではなくdatetime型でプロットしたい)
これは嫌。三つの値が等間隔になってる

BodyWeight_date.txt

2020-07-18 2020-07-31 2020-08-02

BodyWeight_weight.txt

50.9 50.8 51.1

試したこと

下記(txtから読み込んでない)だとやりたいことが実現できています。

python

1temperature = [(datetime.datetime.strptime(t, '%Y-%m-%d %H:%M:%S'), v) for t,v in [ 2 ('2018-11-08 23:13:00', 37.5), 3 ('2018-11-19 01:12:00', 39.0), 4 ('2018-12-19 02:38:00', 38.1), 5 ('2018-12-19 10:14:00', 37.0), 6 ('2018-12-19 18:44:00', 36.7), 7 ('2018-12-19 21:41:00', 37.5), 8 ('2018-12-20 03:17:00', 37.5), 9 ('2018-12-20 11:47:00', 37.0), 10 ('2018-12-20 16:58:00', 36.6), 11 ('2018-12-20 19:14:00', 37.2), 12 ('2018-12-21 19:34:00', 36.8), 13 ('2018-12-22 00:42:00', 36.7), 14 ('2018-12-22 14:59:00', 36.8), 15]] 16import pandas as pd 17df = pd.DataFrame(temperature, columns=['time', 'temperature']) 18x=[] 19y=[] 20for row in temperature: 21 x.append(datetime.date(row[0].year, row[0].month, row[0].day)) 22 y.append(row[1]) 23ax = plt.subplot() 24print(x) 25print(y) 26ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d')) 27# ax.set_xlim(datetime.datetime(2018, 12, 18, 18), datetime.datetime(2018, 12, 22, 18)) 28# ax.set_ylim(36.3, 39.2) 29print(type(x[0])) 30ax.plot(x,y) 31plt.show()

データが等間隔になってなく、日付を元にしている
間違ってエラーが出るコードで作成したdate_list,coins_listのtypeは上記の思い通り動いたコードのx,yと同じはずです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

txtに書き込む際にdate_listをstrに変換して上書きしていたためだと思われます。
書き込み用リストをdate_list_wとして、別リストにしたら動きました。

python3

1import datetime 2import numpy as np 3import matplotlib.pyplot as plt 4import matplotlib.dates as mdates 5 6path_date = 'BodyWeight_date.txt' 7path_coins = 'BodyWeight_weight.txt' 8 9def add_data(coins): 10 with open(path_date) as f: 11 date_list = [s.strip() for s in f.readlines()] 12 print(date_list) 13 date_list = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in date_list] 14 date_list = [datetime.date(date.year, date.month, date.day)for date in date_list] 15 date_list.append(datetime.date.today()) 16 17 with open(path_coins) as f: 18 coins_list = [float(s.strip()) for s in f.readlines()] 19 20 coins_list.append(coins) 21 print(type(date_list[0])) 22 print(date_list) 23 print(coins_list) 24 25 26 with open(path_date, mode='w') as f: 27 date_list_w = [str(t) for t in date_list] 28 f.write('\n'.join(date_list_w)) 29 with open(path_coins, mode='w') as f: 30 coins_list_w = [str(i) for i in coins_list] 31 f.write('\n'.join(coins_list_w)) 32 33 ax = plt.subplot() 34 ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d')) 35 ax.plot(date_list,coins_list) 36 plt.show() 37add_data(51)

figure

投稿2020/08/03 00:20

jeanbiego

総合スコア3966

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

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

Kamal_kobu

2020/08/05 07:40

ありがとうございます! 試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問