5倍速!メールマガジン
外部アカウントで登録
受講生の声
新着の講座投稿
新着の講座コメント
新着のノート投稿
投稿一覧へ新着のノートコメント
表示できる投稿はありません。
サイト運営者紹介
小川 慶一講師/教材/システム開発者紹介
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
藤本 博子さんの投稿
(投稿ID: 5362)
■結論
・pythonで日付データを生成し、CSVへ書き込み、保存したファイルを開いた場合
生成した日付データの表示形式が秒単位以下の細かい単位になると、見た目が誤変換のように見えました。
日付データをmicroseconds単位で書き込みしたCSVを開くと、00:00.0 という表示形式になりました。
しかし、pythonで生成した日付データは、正しい内容でCSVに保存されており、CSV→Excelにpntyonで生成した日付データの内容で書き出せることを確認しました。
(ISO8601形式? yyyy-mm-dd hh:mm:ss.SSSSSS (例)2022-03-01 10:00:00.016000)
・textファイルでpythonのmicroseconds単位の日付データを書き込んだ場合、表示形式はpythonで生成した書式形式と同じでした。(事前に文字列に変換しないとtextに書き込みできませんが)
結果は問題なかったので、自分的には、慌てずに対処しようと思いました。という、どうしようもないオチです…
実際に自分で確かめたこと、また小川先生にリライトしてもらったcsv.Dictwriter,Dictreaderや辞書型への変換のバリエーションなど、自分のケースで適用できたことはよかったと思いました。
一応試したこと
・CSVへ書き出すときに、日付データをstrftimeメソッドで文字列に予め変換しても、マイクロ秒の日付データは、CSVでは、00:00.0という書式のままでした。
・また、CSVへ書き込む時に表示形式を指定できるのか方法を探しましたがみつかりませんでした。
■確認した背景
実務で日付データを扱うVBAの相談を受けたことがありました。(日付データは、秒単位、ミリ秒と単位が細かい)
作業内容は、参照元のCSVファイルから、指定された開始日時、終了時間に該当する部分だけ、所定のExcelファイルに書き込む、その際、参照元(csv)と書き込み先(Excel)の行見出しの順序は一致しない)というものです。
pythonでも同じ作業をすることができるか、確認したいと思いました。
■確認したこと:
「1」pythonでCSVに書き込みした場合
timedeltaオブジェクトの引数単位別加算して50行のデータを生成。CSVで日付データがどう表示されるのか確認しました。
timedelta(引数) csv書出(見た目上) データの中身
minutes=1 2022/3/1 10:01 2022/3/1 10:01:00 ・・・分単位であれば、誤変換と間違う混乱は無し
seconds=1 2022/3/1 10:00 2022/3/1 10:00:01 ・・・見た目上、秒単位が表示されない。実際のデータの中身は問題無し
microseconds1=1000 00:00.0 2022/3/1 10:0:0.001 ・・・見た目上、誤変換と見間違う。でも、実際のデータの中身は問題無し(ユーザー定義が必要 yyyy/m/d h:m:s.000)
notepad(txtファイル)から開くと、日付データは正しく表示される。 例:2022-03-01 10:00:00.001000
float型の表示
元データ(小数点17桁)→ 書出先のCSV:小数点15桁まで表示(16桁目切捨)
notepad(txtファイル)から開くと、元データと同じく小数点16桁まで表示される
「2」pythonから書き込んだCSVファイルを読み込み、Excelへ書き込んだ場合
日付データ → 元データと同じマイクロセカンド(6桁表示)2022-03-01 10:00:00.002000
float型 → 小数点16桁まで表示(文字列型になってましたが)
「3」pythonで、textファイルへ書出した場合
・textへ書き込む場合、事前に文字列に変換が必要となります。writeメソッド(文字列) writelines()メソッドもあるようですが・・・
書出し内容が日付データ、数値の場合は、文字列に変換する必要があるので、CSVで書き込みした方がよいと思いました。
・表示される日付データの書式、float型小数点の桁数は、pythonで生成した元データと同じ桁数になりました。
田中 宏明さんのコメント
(コメントID: 7717)
が、過去にVBAでCSVの日付データ(ミリ秒)をExcelに正しく書き出しされたという
話自体がスーパー事務員を物語っていますね。
CSVとは、Comma Separated Valueの略。
Comma(カンマ)でSeparated (区切られた)Value(値)が規則的に配置された
テキストファイルで書式情報を持っていないので、取り扱いに苦労しています。
小川 慶一さんのコメント
(コメントID: 7718)
「結論」を読んだのですが、何が言いたいのか分かりませんでした。
以下がもつれているからではないかと感じます。
それぞれ別物として考えてください。
[a]
PythonからのCSVファイルへの、ミリ秒単位の日付時刻の出力
(テキストファイルでも良いのですが、要はテキスト形式での日付時刻の出力)
[b]
ミリ秒単位の日付時刻を含むCSVファイルの、エクセルでの読み込み
[c]
ミリ秒単位の日付時刻を含むCSVファイルの、エクセル形式への変換
[d]
ミリ秒単位の日付時刻を含むエクセルファイルの、エクセルでの読み込み
[b], [d] は、いったん開いたあとでも、セルの書式設定で「yyyy/mm/dd h:mm:ss.000」や「h:mm:ss.000」を指定すればいけるのではないという気も。
一気にやりたいなら、ファイルを開く→ミリ秒を含む日付時刻を含む列の書式設定を自動で行うマクロを書いてしまえば良いかと。
workbook の open イベントを使えば一気にやれるかも。
[c] については、[b], [d] が解決したならば、[c]では悩む必要はなくなるかと。
上記のとおりに [b], [c], [d] が解決したならば [a] で日付時刻の出力をどうするかということは、「[b]で問題にならないような書式で出力すれば良い」という平易な問題になります。
田中さんもおっしゃっているとおり、CSVファイルは、拡張子こそ .csv ですが、中身は値が comma で区切られた文字列が並ぶテキストファイルです。
なので、 notepad 等のテキストエディタで開くと、テキスト形式で中身を見ることができます。
一方、エクセルで(ファイル読み込みウィザード等を用いずに、単純にダブルクリック等で)開こうとすると、エクセルは、セルの値を元に列ごとの書式を勝手に変更してしまいます。
藤本 博子さんのコメント
(コメントID: 7722)
コメントくださいまして、ありがとうございます。
CSVファイルをダブルクリックし、Excelが起動した時の仕様について理解不足でした。
私の理解不足、考えのもつれを解きつつ、解説くださいましてありがとうございます。
Excelは、セルの値を元に、列ごとの書式を勝手に変更してしまうことを理解しました。
数字のみの値で先頭の0(ゼロ)が消える(ゼロ落ち)の場合の対処法は行っていたのですが、
日付のデータの変換が、自分の想定外の挙動だったので、混乱していまいました。
申し訳ございません。
田中さんの実務上の経験を踏まえたお返事も大変参考になりました。
田中さん
私は、抜け作事務員です…(;^_^A
これからも、色々教えていただけると、とってもうれしいです。
大変参考になりました。ありがとうございます!