さまざまな形式のデータを含むノートブックで試してはいないが、"File > Download as"のメニューでPDFを選択してそれを印刷するのが楽。
ただし、8tops上のjupyter notebookでは日本語の出力ができない。
その場合の回避策としては、
WordやPowerPointなどに貼るには、jpegやpng形式の画像よりスケーラブル(アウトライン、ベクトル形式)画像を用いたほう高品質な印刷物が得られる。
Microsoft Officeで使えるスケーラブル画像形式はemfである一方、matplotlibで使えるスケーラブル画像はsvgやeps形式での出力ができる。後者から前者への変換ソフトとして、ubuntuにはInkspaceが備わっているので、いったんsvg形式のファイルをつくり、それをInkspaceに渡してemfにする。
そのためには、外部プログラムを呼び出すsubprocessという関数を用いる。
import subprocess
# 中略
plt.savefig('sample_image.svg', bbox_inches='tight') # tight指定は周辺の余白を取り除くため
subprocess.call('inkscape sample_image.svg -M sample_image.emf', shell=True)
plt.savefig("prob2_10_5.pdf", bbox_inches="tight", pad_inches=0.05)
fontsize = 14
plt.rcParams.update({'font.size': fontsize})
fig = plt.figure( figsize=fig_size)
plt.subplots_adjust(hspace=0.25) # plt.figureの後に置く必要がある
フォントの大きさを変えたり、軸ラベルが長かったりすると字が重なる場合がある。その時の調整は
plt.subplots_adjust(wspace=0.4, hspace=0.6)
figure全体のタイトル
fig.suptitle("時間ごとのパケット数分布")
凡例のタイトル
ax.legend(title="時")
Web上にいろいろな情報があるが、研究室で用いそうなものをメモしておく。
from datetime import datetime as dt
from datetime import timedelta
date_str = "20191001" # 文字列
date_datetype = dt.strptime(date_str, "%Y%m%d") # 第2引数で文字列の形式を指定
date_datetype
print(date_datetype)
# 1日後
tomorrow = dt.strptime(date_str, "%Y%m%d") + timedelta(days=1)
print(tomorrow)
# 1日後の日付を文字列に直す
dt.strftime(tomorrow, "%Y%m%d")
# epoch time(1970-01-1 00:00:00)からの秒数を日付型に変換する
dt.fromtimestamp(1569989110.042173000)
# date型 ⇒ epoch time (date型のオブジェクトのメンバ関数を利用)
a = dt.fromtimestamp(1569989110.042173000)
print(a)
a.timestamp()
dt.fromtimestamp(2147483648) # 2^31 ← 2038年問題
import datetime as dt
d = dt.datetime(2020, 9, 26, 12,1,0)
d2 = d.replace(minute=59, second = 59)
print(d2)
import pandas as pd
d = pd.to_datetime(1592233213, unit='s', utc=True).tz_convert('Asia/Tokyo')
d
df['date']に文字列で日時が入っているとする
詳しくは、 hakushuTraffic.html参照
df['date_obj'] = pd.to_datetime(
df[p]['date']) # dateは文字列なので、datetime型の列を新設
df['hour_min'] = df['date_obj'].dt.strftime("%H:%M") # 時分の文字列の列を新設
df['day-of-week'] = df['date_obj'].dt.dayofweek
df4av_weekend = df[(dt.strptime(from_date, "%Y-%m-%d") <= df['date']) &
(df['date'] <= dt.strptime(to_date, "%Y-%m-%d")) &
(df['date_obj'].dt.dayofweek >= 5)]
df4av_weekday = df[(dt.strptime(from_date, "%Y-%m-%d") <= df['date']) &
(df['date'] <= dt.strptime(to_date, "%Y-%m-%d")) &
(df['date_obj'].dt.dayofweek < 5)]
Linux上でスクリプトを実行するときには、パラメータを実行時に指定できるようにしておくと便利である。
繰り返しあるいは同時並行でプログラムを実行できるから。
下のように1行目にコマンドを書いておく。
簡単には、
#!/usr/bin/env python3
import sys
args = sys.argv
print(args[0])
print(args[1])
print(args[2])
のように、sys.argvにコマンドライン引数の値が入る。順序を間違わなければこれでもよいが、引数の数や順序にかかわらず、指定できるようにするには、 ライブラリargsparseを利用する。
たとえば、
./xxx.py -s 20180821 -e 20180911 xxxx.csv
のように指定する。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
実用的なコマンドライン引数: argparse
標準では sys.argv[0], sys.argv[1], のように順番にsys.argvに入るが、
たくさんの引数や、あってもなくてもよい引数を使いたい場合には
argparseを利用するのが便利
- "-s"のようなのはなくても良い
- filenameは必須
- 規則に合わない場合は使い方を表示してくれる。
"""
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("filename")
parser.add_argument("-s","--stime")
parser.add_argument("-e","--etime")
args = parser.parse_args()
print(args)
パラメータを変えて同じスクリプトを並列にバックグラウンドで実行するにはbatchというコマンドを利用する。
利用方法については、
https://toyoki-lab.ee.yamanashi.ac.jp/~toyoki/labTips/batchTutorial.html
の下の方に書いてある。