2017-11-16 22 views
1

日付は、セルの右下隅に表示され、xlsxwriterからの配置設定は明らかに無視されます。 MWE:python xlsxwriterは日付を揃えません

import pandas 

df = pandas.DataFrame(
    { 
     "ints": [1, 2, 3] 
     , 'primes': [2, 3, 5] 
     , 'odds': [1, 3, 5] 
     , 'fechas': ['2017-04-07', '2017-05-09', '2017-11-30'] 
    } 
) 

df['fechas'] = pandas.to_datetime(df['fechas']).dt.date 

print(df) 

xlsx_writer = pandas.ExcelWriter(
    'test.xlsx' 
    , engine='xlsxwriter' 
    , date_format='mm/dd/yyyy' 
) 

df.to_excel(xlsx_writer, sheet_name='Sheet1', index=False) 
wb = xlsx_writer.book 
ws = xlsx_writer.sheets['Sheet1'] 


dollar_format = '_($* #,##0.00" "_);_($* (#,##0.0);_($* "-"??_);_(@_)' 
dollar_format_wb = wb.add_format({'num_format': dollar_format, 'valign': 'vcenter'}) 
centre_format_wb = wb.add_format({'align': 'center', 'valign': 'vcenter'}) 

ws.set_column('A:A', 25, centre_format_wb) 
ws.set_column('B:B', 20, centre_format_wb) 
ws.set_column('C:C', 15, centre_format_wb) 
ws.set_column('D:D', 10, dollar_format_wb) 

# The code below was included to generate the screenshot, but isn't 
# strictly necessary for the MWE 
shadedrow_format_wb = wb.add_format(
    { 
     'bg_color': '#EEEEEE' 
     , 'left': 1 
     , 'left_color': '#FFFFFF' 
    } 
) 

for r in range(0, 2 + df.shape[0]): 
    ws.set_row(r + 1, 45) 
    print(r) 
    if r % 2 == 0: 
     # a kludge as we can't change cell range formats after the fact without re-entering cell contents 
     ws.conditional_format('A{:}:D{:}'.format(r, r), {'type': 'no_errors', 'format': shadedrow_format_wb}) 
     print("\t", r) 

xlsx_writer.save() 

列A、B、及びCは、水平中心されるべきであり、すべてのセルの内容が垂直中心とヘッダ以外のすべての行は、高さ45であるべきです。

excel screen shot

それが必要のようにすべてが日付列を除き、動作します。これがうまくいかない理由がありますか?日付を中央に置く正しい方法はありますか?バグですか?回避策はありますか?

Iは、第一シートをフォーマットし、影響を与えずに、df.to_excel()が最後の実行しようとしています。

多くの感謝!

+0

謝罪 - 私は編集がよりよいのためにマイナーだったと述べていることを怠っ(そして、より正確にタイトルをつけた) – GoneAsync

答えて

1

私はあなたがパンダを使用しての.xlsx出力で、ご希望の日付の書式設定を実現することができる方法の例を提供してきました。また、datetimeモジュールを追加する必要があります。

@jmcnamaraが述べたように

は、私が最良かつ最も柔軟なソリューションをxlsxwriter直接使用することだと思います。

はここでエクセル「シリアル日付」形式とPythonでのdatetimeオブジェクトからそれを得ることの詳細な背景を提供してlink to another SO answerです。これは、カラムをExcelの日付に変換したのと本質的に同じです。私はまた、追加のフォーマット( "centre_date_format_wb"と呼ばれる)を追加しました。

ここに私の追加/変更を完全なコードです:

import pandas 
import datetime 

df = pandas.DataFrame(
    { 
     "ints": [1, 2, 3] 
     , 'primes': [2, 3, 5] 
     , 'odds': [1, 3, 5] 
     , 'fechas': ['2017-04-07', '2017-05-09', '2017-11-30'] 
    } 
) 

df['fechas'] = pandas.to_datetime(df['fechas']).dt.date 


excel_start_date = datetime.date(1899, 12, 30) 
df['fechas'] = df['fechas'] - excel_start_date 
df.fechas = df.fechas.dt.days 

print(df) 

xlsx_writer = pandas.ExcelWriter(
    'test.xlsx' 
    , engine='xlsxwriter' 
) 

df.to_excel(xlsx_writer, sheet_name='Sheet1', index=False) 
wb = xlsx_writer.book 
ws = xlsx_writer.sheets['Sheet1'] 


dollar_format = '_($* #,##0.00" "_);_($* (#,##0.0);_($* "-"??_);_(@_)' 
dollar_format_wb = wb.add_format({'num_format': dollar_format, 'valign': 'vcenter'}) 
centre_format_wb = wb.add_format({'align': 'center', 'valign': 'vcenter'}) 
#additional format added below 
centre_date_format_wb = wb.add_format({'align': 'center', 'valign': 'vcenter', 'num_format' : 'mm/dd/yyyy' }) 

ws.set_column('A:A', 25, centre_date_format_wb) 
ws.set_column('B:B', 20, centre_format_wb) 
ws.set_column('C:C', 15, centre_format_wb) 
ws.set_column('D:D', 10, dollar_format_wb) 

# The code below was included to generate the screenshot, but isn't 
# strictly necessary for the MWE 
shadedrow_format_wb = wb.add_format(
    { 
     'bg_color': '#EEEEEE' 
     , 'left': 1 
     , 'left_color': '#FFFFFF' 
    } 
) 

for r in range(0, 2 + df.shape[0]): 
    ws.set_row(r + 1, 45) 
    print(r) 
    if r % 2 == 0: 
     # a kludge as we can't change cell range formats after the fact without re-entering cell contents 
     ws.conditional_format('A{:}:D{:}'.format(r, r), {'type': 'no_errors', 'format': shadedrow_format_wb}) 
     print("\t", r) 

xlsx_writer.save() 

、得られるワークシートの画像:

Solution image

+0

美しい@ patrickjlong​​1!ありがとうございました! Excelの基本日付は私の頭の中で - これがクロスプラットフォームで動作するかどうか分かりますか? – GoneAsync

+0

@GoneSync、私はこの例ではクロスプラットフォームの問題がないはずだと思います。それはディレクトリ/フォルダのパスを離れてしまうので、LinuxやWindowsでは安全だと思います。 – patrickjlong1

+0

Excelベースの日付が私の頭の中にあります - 基本日付のバージョンとプラットフォームの違いについてもっと心配していました - 私は*古いバージョンのExcelはLotus 1のバグを意図的に複製しているため、 2-3、Macは1904を代わりに使用していたのかもしれませんが、私はそれが間違っているかもしれませんが、混乱は、私よりも時間を費やしている開発者に頼ることによって、私は答えとしてこれを受け入れましたが、あなたが@ jmcnamaraの提案は、トラックに問題が発生した場合、おそらくもっと強力なフォールバックになると言います。お二人のおかげで! – GoneAsync

1

問題は、Pandasが日付用のセル形式を適用しており、これが列形式をオーバーライドすることです。

それを回避する唯一の方法は、データフレームを反復して、必要なすべてのフォーマットを適用し、直接XlsxWriterに書き込むことになります。

+0

@jmcnamaraありがとう - 私はパンダでそれを取り上げ、その間にあなたの提案を使用します。 – GoneAsync

関連する問題