🎃
pandas の DataFrame(datetime.datetime含む)を Excel に保存する
pandas の DataFrame(datetime.datetime含む)を Excel に保存する
やりたいこと
- DataFrame を Excel に保存する
- datetime.datetime のデータをmicrosec 単位までの情報を含める
- データがデフォルトで表示されるように列の幅を調整する
-
A1
セルでウィンドウ枠の固定
を行う。
ポイント
- pd.ExcelWriter を生成して、DataFrame の to_excel を呼んで Excel に保存する
- DataFrame の to_excel で freeze_panes を指定して、
ウィンドウ枠の固定
を行う。-
(1, 1)
の指定で、左側が行(=1)、右側が列(=A)。
-
- DataFrame をExcel に保存する場合、秒精度までであれば、 pandas.ExcelWriter の datetime_format(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.ExcelWriter.html) に
'YYYY-MM-DD HH:MM:SS'
を渡すことで、秒精度まで表示させることができる。 - microsec 単位までの情報を表示させたいので、文字列に変換する。
- pandas.ExcelWriter の sheets (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.ExcelWriter.sheets.html) で set_column を呼ぶことで列の幅を設定する。
リンク
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_excel.html
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.ExcelWriter.html
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.ExcelWriter.sheets.html
- https://towardsdatascience.com/how-to-auto-adjust-the-width-of-excel-columns-with-pandas-excelwriter-60cee36e175e
必要なモジュールのインストール
pip install pandas openpyxl numpy xlsxwriter
コード
#!/usr/bin/python3
"""
This script demonstrates writing dataframe to excel.
Prepare
pip install pandas openpyxl numpy xlsxwriter
See
* https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_excel.html
* https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.ExcelWriter.html
* https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.ExcelWriter.sheets.html
* https://towardsdatascience.com/how-to-auto-adjust-the-width-of-excel-columns-with-pandas-excelwriter-60cee36e175e
"""
import datetime
import pandas as pd
import numpy as np
def timedata(i):
'''
return test data.
'''
return datetime.datetime.now() + datetime.timedelta(microseconds=i*1001*1001)
df = pd.DataFrame(
{
'timestamp': [ timedata(i) for i in range(10)],
'random': np.random.random(10),
}
)
df['timestamp'] = df['timestamp'].dt.strftime('%Y-%m-%d %H:%M:%S.%f')
with pd.ExcelWriter('timestamp-test.xlsx') as writer:
sheet_name='Test'
# freeze_panes to (1, 1) => A1
df.to_excel(writer, sheet_name=sheet_name, index=False, freeze_panes=(1, 1))
for column in df:
column_width = max(df[column].astype(str).map(len).max(), len(column))
col_idx = df.columns.get_loc(column)
writer.sheets[sheet_name].set_column(col_idx, col_idx, column_width)
Discussion