wellwell3176
@wellwell3176

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

dataframeの上に日付を入れたエクセル出力の方法

解決したいこと

元データを日付別に分類し、表1のようなdataframeを100個ほど制作後にエクセル出力する、という自動プログラムを組んだところ、
「エクセルに出力する際には表2のようにして欲しい」と依頼があったが、完全な形で実装できていない。

表1 : dataframe(ファイル名はYYYY-MM-DD.xlsxで保管)

Name Age item
panda 5 Ax
usagi 11 Bot
koara 45 Cup

表2 要求された実装(ファイル名に入れた日付情報を、エクセルファイルの先頭行にも入れてほしい)

YYYY-MM-DD
Name Age item
panda 5 Ax
usagi 11 Bot
koara 45 Cup

自分で試したこと

  1. 最下行に入れる
import pandas as pd
#itemを省略した仮データ
df = pd.DataFrame(
    data=[{'Name': panda, 'Age': 5,},{'Name': "usagi", 'Age': 11,},{'Name': "koara", 'Age': 45}])

#ファイル名に使う日付情報
hiduke="2020-12-01"

df=df.append(pd.Series(dtype=str),ignore_index=True)
df.iat[-1,0]=hiduke
#空の行を一番下に追加し、iatで最下行先頭列を指定して代入

表3 上記プログラムでの出力結果(エクセルにする際にindex=Falseを使用している)

Name Age item
panda 5 Ax
usagi 11 Bot
koara 45 Cup
YYYY-MM-DD

良いアイデアだと思ったのだが「行が多いファイルだと最初に開いた時に日付が見えない」とのことで却下された。

2.マルチインデックスにする

import pandas as pd
df = pd.DataFrame(
    data=[{'Name': panda, 'Age': 5,},{'Name': "usagi", 'Age': 11,},{'Name': "koara", 'Age': 45}])
hiduke="2020-12-01"

df.columns=pd.MultiIndex.from_tuples(zip([hiduke,""],df.columns))
#マルチインデックスのでNAME,AGEの上に日付を入れる

表4 上記プログラムでの出力結果

YYYY-MM-DD
Name Age
0 panda 5
1 usagi 11
2 koara 45

マルチインデックスを使う場合、エクセルに出力する際にIndex=Falseが使えず、1列目に連番が残る。
この連番は不要とのことで却下。

3. openpyxlで全部書き直す

最終手段。エクセルファイルに出力する際にstartrow=1として1行目を開けておき、
出力したファイルをopenpyxlで読み込み直してA1にhidukeを代入する。

間違いなく実現はできるはずのだが、極めて不格好な気がするので未作成。
もっと良い方法があってもいいような・・・。

0

2Answer

import pandas as pd

df = pd.DataFrame(data=[
  {'Name': "panda", 'Age': 5,},
  {'Name': "usagi", 'Age': 11,},
  {'Name': "koara", 'Age': 45}
])

df.loc[-1] = df.columns.values.tolist()
df.index = df.index + 1
df.sort_index(inplace=True) 
df.columns = ['2020-12-01', '']
df.to_excel("test.xlsx", index=False)

表2をもう一度pandasで読み出すということはしないなら
上の方法はどうですか?

1Like

Comments

  1. @wellwell3176

    Questioner

    @airix 様

    回答どうもありがとうございます。
    前提条件の説明が悪かったらしく、大変失礼いたしました。

    なるほど。dataframe形状を崩せるのであれば、もう徹底的にやっているんですね。
    0行目にcolumns名のコピーを入れて、columns名を日付に変える・・・この発想はありませんでした。

    これならば実装できそうです。
    どうもありがとうございました。


表2はpandasのdataframeを破壊する形です
表2にむりありに変えたらエクセルを読むとき問題があります
YYYY-MM-DDをエクセル名に追加して書くほうがいいです

0Like

Comments

  1. @wellwell3176

    Questioner

    それは分かっているんですが、ファイルを使用する現場の要望なので・・・
    表2は現場が使うエクセルファイルであり、表2をもう一度pandasで読み出すということはしないのです。その状況でpandasで読み込んだときに問題が出るから表2の形でエクセル出力することはしない、という主張は厳しい気がしています

Your answer might help someone💌