質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.38%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

3回答

4444閲覧

python pandas にて シリアル値 から 日付へ 列ごと変更

takumataukma

総合スコア16

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/04/23 14:37

CSVからデータを読み込み pandasのデータフレームの中で シリアル値→日付に直したいのですが
なかなかうまくいきません。

例 43532.3 → 2019/3/12(日付は適当です) 
の形になればうれしいのですが 誰か教えて頂ければ幸いです。

できれば列ごと直したいです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/04/23 15:42

どういう法則で日付になるんでしょうか
guest

回答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

magichan

総合スコア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

can110

総合スコア38337

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

シリアル値が何を意味しているのかわからないので、とりあえずunixtimeであるとします。この場合、datetimeモジュールに実装される関数を使うと日付に変換可能です。

python3

1from datetime import datetime 2datetime.fromtimestamp(変換対象の数値)

投稿2019/04/23 23:14

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.38%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問