CSVからデータを読み込み pandasのデータフレームの中で シリアル値→日付に直したいのですが
なかなかうまくいきません。
例 43532.3 → 2019/3/12(日付は適当です)
の形になればうれしいのですが 誰か教えて頂ければ幸いです。
できれば列ごと直したいです
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
シリアル値とはExcelのタイムスタンプの事でしょうか?
調べてみると
基本的には1900年1月0日を起算日として、0から始まるシリアル値(連続値)で持っている。
とあります。であれば、単純に
Python
1pd.to_datetime('1900/1/1') + pd.to_timedelta(df['シリアル値'] - 1, unit='days')
にて変換できそうです。
と思いましたが・・・計算が合わない。
よくよく調べてみますと
現行のグレゴリオ暦では1900年はうるう年ではなく、平年であるため閏日(1900年2月29日)は存在しないはずであるが、Windows版Excelでは、1900年2月29日を存在するものとして計算してしまう。
という謎のバグが存在するとの事ですので、 1900/3/1 以降は更に1
を引く必用がありそうですので、関数化して
Python
1def exceltime2datetime(et): 2 if et < 60: 3 days = pd.to_timedelta(et - 1, unit='days') 4 else: 5 days = pd.to_timedelta(et - 2, unit='days') 6 return pd.to_datetime('1900/1/1') + days
とでもして、Series.apply()
で叩くとよいのではないでしょうか。
一応動作確認サンプル
Python
1import pandas as pd 2 3def exceltime2datetime(et): 4 if et < 60: 5 days = pd.to_timedelta(et - 1, unit='days') 6 else: 7 days = pd.to_timedelta(et - 2, unit='days') 8 return pd.to_datetime('1900/1/1') + days 9 10 11df = pd.DataFrame({'シリアル値': [43532.3,]}) 12df['日時'] = df['シリアル値'].apply(exceltime2datetime) 13 14# シリアル値 日時 15#0 43532.3 2019-03-08 07:12:00
投稿2019/04/24 00:11
総合スコア15898
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
値が小数を含むことからExcelの日付シリアル値として回答します。
エクセル日付の「数値」を python の datetime に変換するを参考にすると、以下のようにして変換できます。
他、参考:DATE 関数
Python
1from datetime import datetime, timedelta 2import pandas as pd 3 4df = pd.DataFrame({'dt':[43579.5242592593]}) # 2019-04-24 12:34:56 5df['dt'] = df['dt'].apply( lambda x: datetime(1899, 12, 30) + timedelta(days=x)) 6print(df) 7""" 8 dt 90 2019-04-24 12:34:56.000003 10"""
投稿2019/04/24 00:13
総合スコア38341
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
シリアル値が何を意味しているのかわからないので、とりあえずunixtimeであるとします。この場合、datetimeモジュールに実装される関数を使うと日付に変換可能です。
python3
1from datetime import datetime 2datetime.fromtimestamp(変換対象の数値)
投稿2019/04/23 23:14
総合スコア3376
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。