ことのほったん
pandas.read_excelでExcelの日付を読み込むと書式設定によってデータが数値のシリアル値になった。
datetime.datetimeで統一して処理したいので変換することにした。
int
のシリアル値をdatetime.datetimeに変換する方法
# date_int : シリアル値
if date_int < 60:
# 1900-03-01より前の場合
days = date_int -1
else:
# 1900-03-01以降の場合
days = date_int - 2
date_time = pandas.to_datetime('1900/01/01') + datetime.timedelta(days=days)
こんな感じでやってみた
- 環境
- macOS Catalina バージョン10.15.7
- Microsoft Excel for Mac バージョン16.42
- Python 3.8.5
- pandas 1.1.3
- 参考
import datetime
import pandas
def get_datetime(val: object) -> datetime.datetime:
"""日付を取得する.
:param val: 日付の元になる値
:return: 日付かシリアル値であれば日付、それ以外はNone
"""
val_type = type(val)
# datetime.datetimeだったらそのまま返却
if val_type is datetime.datetime:
return val
# pandas.Timestampはdatetime.datetimeを継承していてdatetime.datetimeとして処理できそうなのでそのまま返却
if issubclass(val_type, datetime.datetime):
return val
# intだったらシリアル値としてdatetime.datetimeに変換して返却
if val_type is int:
if val < 60:
# 1900-03-01より前の場合
days = val -1
else:
# 1900-03-01以降の場合
days = val - 2
return pandas.to_datetime('1900/01/01') + datetime.timedelta(days=days)
return None
if __name__ == '__main__':
# pandasでExcelを読み込む
sheet = pandas.read_excel('Book.xlsx', sheet_name='Sheet1', header=None)
for index, row in sheet.iterrows():
date = get_datetime(row[0])
if date is not None:
print(date.strftime('%Y/%m/%d'))
出力
2020/10/14
2020/10/15
2020/10/16
2020/10/17