Pandas批量統(tǒng)一雜亂日期格式為XX月XX日的實現(xiàn)方法
摘要
在日常Python數(shù)據(jù)分析、Excel數(shù)據(jù)處理場景中,經(jīng)常會遇到表格日期格式雜亂不統(tǒng)一的問題,數(shù)據(jù)中同時存在時間戳日期、年.月.日字符串、月.日簡寫、空值等多種格式。Pandas默認讀取會自動解析數(shù)據(jù)類型,極易出現(xiàn)5.10被誤轉(zhuǎn)為5.1、日期解析失敗、數(shù)據(jù)丟失等問題。本文將提供一套通用、健壯的解決方案:通過全字符串讀取原始數(shù)據(jù)規(guī)避格式丟失問題,編寫萬能日期轉(zhuǎn)換函數(shù),將所有雜亂日期統(tǒng)一格式化為XX月XX日中文格式,并支持一鍵導(dǎo)出Excel文件,完美適配各類不規(guī)則日期數(shù)據(jù)處理場景。
項目背景
在處理業(yè)務(wù)Excel數(shù)據(jù)時,日期列格式混亂是高頻痛點,常見的不規(guī)則日期格式如下:
- 標準時間戳格式:
2026-05-16 00:00:00 - 年.月.日字符串格式:
2026.5.18 - 簡寫月.日格式:
5.26、5.2、4.21 - 空值數(shù)據(jù):空白單元格、nan、NaT
如果直接使用Pandas默認方式讀取并轉(zhuǎn)換日期,會出現(xiàn)兩大致命問題:一是浮點型日期5.10丟失末尾0,變成5.1;二是多格式混雜導(dǎo)致解析報錯、數(shù)據(jù)錯亂,無法統(tǒng)一統(tǒng)計展示。因此需要一套兼容所有格式、零數(shù)據(jù)丟失、全自動轉(zhuǎn)換的處理方案。
環(huán)境準備
本次項目僅需pandas庫,若未安裝可執(zhí)行以下命令:
pip install pandas
原始數(shù)據(jù)準備
為方便大家測試使用,本文提供代碼模擬數(shù)據(jù)(無需本地Excel)和本地Excel原始文件數(shù)據(jù)兩種方式,數(shù)據(jù)完全還原真實業(yè)務(wù)雜亂日期場景。
1.1 真實原始數(shù)據(jù)樣例
原始Excel表格包含4列不規(guī)則日期數(shù)據(jù),覆蓋所有常見異常格式:
| 日期列1 | 日期列2 | 日期列3 | 日期列4 |
|---|---|---|---|
| 2026-05-16 00:00:00 | 5.26 | 4.21 | 2026.5.18 |
| 2026-05-27 00:00:00 | 5.26 | 5.11 | 2026.5.18 |
| 2026-06-17 00:00:00 | 5.22 | 2026.5.18 | |
| 2026-05-23 00:00:00 | 5.22 | 2026.5.18 | |
| 2026-05-26 00:00:00 | 5.18 | 2026.5.18 | |
| 5.2 | 2026.5.20 | ||
| 5.26 |
1.2 兩種數(shù)據(jù)使用方式
1、本地文件模式:新建Excel文件,命名為你的原始文件.xlsx,將上述表格粘貼進去,用于讀取本地真實數(shù)據(jù);
2、代碼模擬模式:無需創(chuàng)建任何文件,代碼內(nèi)置完整測試數(shù)據(jù),可直接運行測試。
完整可運行代碼(帶詳細注釋)
核心優(yōu)化:全字符串讀取數(shù)據(jù),徹底規(guī)避浮點數(shù)據(jù)精度丟失問題,兼容所有日期格式,容錯性拉滿。
方式一:模擬數(shù)據(jù)版(零基礎(chǔ)一鍵運行)
import pandas as pd
# 定義通用日期格式化函數(shù):兼容所有雜亂日期格式,統(tǒng)一轉(zhuǎn)為XX月XX日
def format_to_mmdd(x):
# 處理空值:NaN、空字符串、字符串nan統(tǒng)一返回空
if pd.isna(x) or str(x).strip().lower() == "nan":
return ""
# 去除首尾空格,統(tǒng)一格式
s = str(x).strip()
try:
# 優(yōu)先解析標準日期格式(時間戳、年-月-日)
dt = pd.to_datetime(s)
# 格式化輸出:X月X日
return f"{dt.month}月{dt.day}日"
except:
# 解析失敗后,手動處理.分割的自定義日期格式
if "." in s:
parts = s.split(".")
try:
# 處理 月.日 格式(例:5.26)
if len(parts) == 2:
return f"{int(parts[0])}月{int(parts[1])}日"
# 處理 年.月.日 格式(例:2026.5.18)
if len(parts) == 3:
return f"{int(parts[1])}月{int(parts[2])}日"
except:
# 格式異常返回空
return ""
# 無法識別的格式統(tǒng)一返回空
return ""
# 1. 內(nèi)置模擬原始數(shù)據(jù),強制全字符串格式,杜絕數(shù)據(jù)類型轉(zhuǎn)換問題
df = pd.DataFrame({
"日期列1": ["2026-05-16 00:00:00", "2026-05-27 00:00:00", "2026-06-17 00:00:00",
"2026-05-23 00:00:00", "2026-05-26 00:00:00", "", ""],
"日期列2": ["5.26", "5.26", "5.22", "5.22", "5.18", "5.2", "5.26"],
"日期列3": ["4.21", "5.11", "", "", "", "", ""],
"日期列4": ["2026.5.18", "2026.5.18", "2026.5.18", "2026.5.18",
"2026.5.18", "2026.5.20", ""]
}, dtype=str)
# 2. 批量對所有單元格執(zhí)行日期格式化
df_result = df.applymap(format_to_mmdd)
# 3. 導(dǎo)出處理后的數(shù)據(jù)到Excel,不保留索引
df_result.to_excel("日期格式化結(jié)果.xlsx", index=False)
# 打印結(jié)果查看
print("? 日期格式化完成,處理結(jié)果如下:")
print(df_result)
print("\n? 已成功導(dǎo)出文件:日期格式化結(jié)果.xlsx")
方式二:本地Excel文件讀取版(真實業(yè)務(wù)數(shù)據(jù)使用)
import pandas as pd
# 統(tǒng)一日期格式化函數(shù)
def format_to_mmdd(x):
if pd.isna(x) or str(x).strip().lower() == "nan":
return ""
s = str(x).strip()
try:
dt = pd.to_datetime(s)
return f"{dt.month}月{dt.day}日"
except:
if "." in s:
parts = s.split(".")
try:
if len(parts) == 2:
return f"{int(parts[0])}月{int(parts[1])}日"
if len(parts) == 3:
return f"{int(parts[1])}月{int(parts[2])}日"
except:
return ""
return ""
# ?? 核心關(guān)鍵:dtype=str 強制所有列以字符串讀取,零數(shù)據(jù)丟失
df = pd.read_excel("你的原始文件.xlsx", dtype=str)
# 批量格式化所有日期
df_result = df.applymap(format_to_mmdd)
# 導(dǎo)出結(jié)果
df_result.to_excel("日期格式化結(jié)果.xlsx", index=False)
print("? 本地文件處理完成,結(jié)果已導(dǎo)出!")
程序運行結(jié)果
所有雜亂日期全部統(tǒng)一為XX月XX日中文格式,空值保留空白,無數(shù)據(jù)丟失、無解析錯誤,最終效果如下:
| 日期列1 | 日期列2 | 日期列3 | 日期列4 |
|---|---|---|---|
| 5月16日 | 5月26日 | 4月21日 | 5月18日 |
| 5月27日 | 5月26日 | 5月11日 | 5月18日 |
| 6月17日 | 5月22日 | 5月18日 | |
| 5月23日 | 5月22日 | 5月18日 | |
| 5月26日 | 5月18日 | 5月18日 | |
| 5月2日 | 5月20日 | ||
| 5月26日 | |||
運行代碼后,項目目錄會生成 日期格式化結(jié)果.xlsx 文件,可直接用于報表統(tǒng)計、數(shù)據(jù)展示。 |
高頻踩坑點總結(jié)(核心重點)
坑點1:默認讀取導(dǎo)致浮點日期精度丟失
Pandas默認會將5.10這類數(shù)據(jù)識別為浮點數(shù),自動舍去末尾0,變成5.1,造成日期錯誤。
? 解決方案:讀取Excel時強制 dtype=str,所有數(shù)據(jù)以原始字符串存儲,完全保留原始信息。
坑點2:多格式混雜日期解析報錯
數(shù)據(jù)同時存在時間戳、年.月.日、月.日多種格式,單一解析規(guī)則會直接報錯、返回空值。
? 解決方案:先使用pd.to_datetime解析標準日期,異常捕獲后手動解析自定義格式,雙層邏輯全覆蓋。
坑點3:空值處理不規(guī)范,出現(xiàn)nan文本
原始數(shù)據(jù)中的NaN、空白單元格,直接轉(zhuǎn)換后會在Excel顯示nan,影響美觀和數(shù)據(jù)使用。
? 解決方案:統(tǒng)一捕獲空值、字符串nan,全部替換為空單元格。
坑點4:帶時分秒的時間戳無法截斷
原始數(shù)據(jù)含2026-05-16 00:00:00帶時間的日期,普通格式化會保留時分秒,無法統(tǒng)一格式。
? 解決方案:通過pd.to_datetime自動提取年月日,舍棄無用時間部分。
拓展用法(按需開啟)
如果需要補零格式(如 05月02日 標準統(tǒng)一格式),只需修改函數(shù)內(nèi)return語句即可:
# 原代碼
return f"{dt.month}月{dt.day}日"
# 修改為補零格式
return f"{dt.month:02d}月{dt.day:02d}日"
修改后效果:5月2日 → 05月02日,適合需要統(tǒng)一字符長度的報表場景。
總結(jié)
本文提供的Pandas日期格式化方案,完美解決了業(yè)務(wù)中多格式混雜日期統(tǒng)一處理的痛點,核心優(yōu)勢如下:
1、零數(shù)據(jù)丟失:全字符串讀取,徹底解決浮點精度丟失問題;
2、兼容性極強:支持時間戳、年.月.日、月.日、空值等所有常見格式;
3、容錯性高:異常格式自動忽略,程序不會報錯中斷;
4、開箱即用:支持模擬數(shù)據(jù)測試+本地文件讀取,一鍵導(dǎo)出Excel。
該代碼可直接復(fù)用在所有Excel日期清洗場景,大幅提升數(shù)據(jù)處理效率。
到此這篇關(guān)于Pandas批量統(tǒng)一雜亂日期格式為XX月XX日的實現(xiàn)方法的文章就介紹到這了,更多相關(guān)Pandas統(tǒng)一雜亂日期格式為XX月XX日內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中消息訂閱應(yīng)用開發(fā)的最優(yōu)5個方案及代碼實現(xiàn)
消息訂閱是現(xiàn)代分布式系統(tǒng)中實現(xiàn)異步通信和解耦的核心技術(shù)之一,本文將為大家詳細介紹一下5種最優(yōu)的消息訂閱方案,感興趣的小伙伴可以了解下2025-03-03
詳解pandas中MultiIndex和對象實際索引不一致問題
這篇文章主要介紹了詳解pandas中MultiIndex和對象實際索引不一致問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
python和mysql交互操作實例詳解【基于pymysql庫】
這篇文章主要介紹了python和mysql交互操作,結(jié)合實例形式詳細分析了Python基于pymysql庫實現(xiàn)mysql數(shù)據(jù)庫的連接、增刪改查等各種常見操作技巧,需要的朋友可以參考下2019-06-06
python 監(jiān)控某個進程內(nèi)存的情況問題
這篇文章主要介紹了python 監(jiān)控某個進程內(nèi)存的情況問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05

