首頁 > 軟體

Python Pandas讀取Excel日期資料的例外處理方法

2022-02-28 16:02:42

異常描述

有時我們的Excel有一個調整過自定義格式的日期欄位:

當我們用pandas讀取時卻是這樣的效果:

不管如何指定引數都無效。

出現原因

沒有使用系統內建的日期單元格格式,自定義格式沒有對負數格式進行定義,pandas讀取時無法識別出是日期格式,而是讀取出單元格實際儲存的數值。

解決方案:修改自定義格式

可以修改為系統內建的自定義格式:

或者在自定義格式上補充負數的定義:

增加;@即可

pandas直接解析Excel數值為日期

有時這種Excel很多,我們需要通過pandas批次讀取,挨個人工修改Excel的自定義格式費時費力,下面我演示如何使用pandas直接解析這些數值成為日期格式。

excel中常規格式和日期格式的轉換規則如下:

1900/1/1為起始日期,轉換的數位是1,往後的每一天增加1

1900/1/2轉換為數位是 2

1900/1/3轉換為數位是 3

1900/1/4轉換為數位是 4

以此類推

excel中時間轉換規則如下:

在時間中的規則是把1天轉換為數位是 1

每1小時就是 1/24

每1分鐘就是 1/(24×60)=1/1440

每1秒鐘就是 1/(24×60×60)=1/86400

根據Excel的日期儲存規則,我們只需要以1900/1/1為基準日期,根據數值n偏移n-1天即可得到實際日期。不過還有個問題,Excel多儲存了1900年2月29日這一天,而正常的日曆是沒有這一天的,而我們的日期又都是大於1900年的,所以應該偏移n-2天,乾脆使用1899年12月30日作為基準,這樣不需要作減法操作。

解析程式碼如下:

import pandas as pd
from pandas.tseries.offsets import Day

df = pd.read_excel("日期.xlsx")
basetime = pd.to_datetime("1899/12/30")
df.日期 = df.日期.apply(lambda x: basetime+Day(x))
df.日期 = df.日期.apply(lambda x: f"{x.month}月{x.day}日")
df.head()
 日期
06月8日
16月9日
26月10日
36月11日
46月12日

如果需要呼叫time的strftime方法,由於包含中文則需要設定locale:

import pandas as pd
from pandas.tseries.offsets import Day
import locale
locale.setlocale(locale.LC_CTYPE, 'chinese')

df = pd.read_excel("日期.xlsx")
basetime = pd.to_datetime("1899/12/30")
df.日期 = df.日期.apply(lambda x: basetime+Day(x))
df.日期 = df.日期.dt.strftime('%Y年%m月%d日')
df.head()
 日期
02021年06月08日
12021年06月09日
22021年06月10日
32021年06月11日
42021年06月12日

總結 

到此這篇關於Python Pandas讀取Excel日期資料的例外處理的文章就介紹到這了,更多相關Pandas讀取Excel日期資料內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com