

◾ 编程语言:.NET/Java/Python/Go/Node...
◾ 移动生态:HarmonyOS/iOS/Android/小程序
◾ 前沿领域:物联网/网络安全/大数据/AI/元宇宙
◾ 游戏开发:Unity3D引擎深度解析
在数据分析和处理的过程中,日期数据往往扮演着至关重要的角色。无论是时间序列分析、数据可视化,还是机器学习模型的构建,正确处理日期数据都是确保分析结果准确性的基础。在Python的Pandas库中,DataFrame提供了强大的工具和方法,使得日期数据的处理变得高效而便捷。
本篇文章将深入探讨如何在DataFrame中处理日期数据,包括日期的解析、格式化、时间戳的转换、日期范围的生成以及缺失数据的处理等关键技巧。我们将通过实例演示每个操作的具体应用,帮助你深入理解如何利用Pandas轻松应对各种日期处理需求。
pandas.to_datetime() 方法可实现批量日期格式转换常见日期格式示例

方法语法
pandas.to_datetime(
arg,
errors='ignore',
dayfirst=False,
yearfirst=False,
utc=None,
box=True,
format=None,
exact=True,
unit=None,
infer_datetime_format=False,
origin='unix',
cache=False
)参数详解
参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| 多种 | - | 输入数据(字符串、数组、Series) |
| str | 'ignore' | 错误处理策略:
- |
| bool | False | 优先解析日为第一位(如 |
| bool | False | 优先解析年为第一位(如 |
| str | None | 自定义格式字符串(如 |
| str | None | 时间单位(D/s/ms/us/ns),用于解析时间戳 |
| bool | False | 自动推断日期格式 |
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.DataFrame({'原日期':['14-Feb-20', '02/14/2020', '2020.02.14', '2020/02/14','20200214']})
df['转换后的日期']=pd.to_datetime(df['原日期'])
print(df)输出结果:

import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df = pd.DataFrame({'year': [2018, 2019,2020],
'month': [1, 3,2],
'day': [4, 5,14],
'hour':[13,8,2],
'minute':[23,12,14],
'second':[2,4,0]})
df['组合后的日期']=pd.to_datetime(df)
print(df)输出结果:

# 包含非法日期的数据转换
mixed_dates = ['2023-02-30', 'invalid_date', '2023-12-01']
pd.to_datetime(mixed_dates, errors='coerce') # 输出:[NaT, NaT, 2023-12-01]# 解析非标准格式日期
custom_format = "%d-%b-%y"
pd.to_datetime("14-Feb-20", format=custom_format) # 输出:2020-02-14# 处理Unix时间戳(单位:秒)
pd.to_datetime(1612345678, unit='s') # 输出:2021-02-03 04:07:58dayfirst和yearfirst同时为True时,yearfirst优先级更高cache=True可提升处理速度utc=True参数可转换为UTC时间infer_datetime_format仅适用于简单格式参数 | 详细说明 |
|---|---|
| True返回DatetimeIndex,False返回numpy数组 |
| 定义参考日期(默认从1970-01-01计算) |
| True要求格式完全匹配,False允许部分匹配 |
建议结合官方文档实践:https://pandas.pydata.org/docs/reference/api/pandas.to_datetime.html
dt对象是Pandas针对日期型Series设计的属性访问器,可快速提取日期元素与特征信息。使用时需确保Series已转换为datetime类型。
# 基础转换方法
df['日期列'] = pd.to_datetime(df['日期列'])分类 | 属性/方法 | 返回值说明 | 示例输出 |
|---|---|---|---|
基础元素 |
| 年份(4位整数) | 2023 |
| 月份(1-12) | 12 | |
| 日期(1-31) | 25 | |
时间特征 |
| 星期全称(英文) | Monday |
| 星期序号(0=周一,6=周日) | 0 | |
| 季度(1-4) | 4 | |
日期判断 |
| 是否年末最后一天(布尔值) | True/False |
| 是否闰年(布尔值) | True/False | |
高级特性 |
| 时分秒(24小时制) | 15/30/45 |
| 年累计天数(1-366) | 359 | |
| ISO标准周数(1-53) | 52 |
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df=pd.DataFrame({'原日期':['2019.1.05', '2019.2.15', '2019.3.25','2019.6.25','2019.9.15','2019.12.31']})
df['日期']=pd.to_datetime(df['原日期'])
print(df)df['年'],df['月'],df['日']=df['日期'].dt.year,df['日期'].dt.month,df['日期'].dt.day
df['星期几']=df['日期'].dt.day_name()
df['季度']=df['日期'].dt.quarter
df['是否年底']=df['日期'].dt.is_year_end
print(df)
# 筛选Q4且为工作日的记录
df_q4_weekdays = df[
(df['日期'].dt.quarter == 4) &
(df['日期'].dt.dayofweek < 5)
]# 生成年月标识(YYYY-MM)
df['年月'] = df['日期'].dt.strftime('%Y-%m')
# 计算半年度标识
df['半年度'] = df['日期'].dt.month.apply(lambda x: 'H1' if x <=6 else 'H2')# 计算星期平均数据
weekly_avg = df.groupby(df['日期'].dt.day_name())['销售额'].mean()datetime64类型assert pd.api.types.is_datetime64_any_dtype(df['日期'])tz_convert统一时区方法 | 说明 |
|---|---|
| 去除时间部分(保留日期) |
| 向上取整到指定频率(如'H') |
| 向下取整到指定频率 |
| 自定义格式化输出 |
| 转换为周期对象(如季度周期) |
通过将日期列设为索引,实现快速日期区间筛选。关键步骤:
import pandas as pd
# 读取数据并提取关键列
df = pd.read_excel('mingribooks.xls')
df1 = df[['订单付款时间', '买家会员名', '联系手机', '买家实际支付金额']]
# 日期列标准化
df1['订单付款时间'] = pd.to_datetime(df1['订单付款时间'])
df1 = df1.sort_values(by='订单付款时间') # 按时间排序df1 = df1.set_index('订单付款时间') # 关键操作!筛选需求 | 语法示例 | 说明 |
|---|---|---|
整年数据 |
| 获取2018全年数据 |
跨年度区间 |
| 包含2017-2018两年数据 |
单月数据 |
| 获取2018年7月所有记录 |
精确日筛选 |
| 获取单日数据 |
自定义区间 |
| 左闭右闭区间 |
案例:获取2018-05-11至2018-06-10订单数据
# 执行筛选
filtered_data = df1['2018-05-11':'2018-06-10']
# 展示结果(示例)
print(filtered_data.head(3))输出结果示例
订单付款时间 | 买家会员名 | 联系手机 | 买家实际支付金额 |
|---|---|---|---|
2018-05-11 11:37:00 | mrhy61 | 55.86 | |
2018-05-11 13:03:00 | mrhy801 | 268.00 | |
2018-05-11 13:27:00 | mrhy40 | 55.86 |
df1['start':'end'] 包含起始和结束日期# 按小时筛选
df1['2018-05-11 08':'2018-05-11 12']# 组合金额条件
filtered_data[(filtered_data['买家实际支付金额'] > 100)]# 按周统计销售额
weekly_sales = df1.resample('W')['买家实际支付金额'].sum()import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
df = pd.read_excel('mingribooks.xls')
df1=df[['订单付款时间','买家会员名','联系手机','买家实际支付金额']]
df1=df1.sort_values(by=['订单付款时间'])
df1 = df1.set_index('订单付款时间') # 将日期设置为索引
#获取某个区间数据
print(df1['2018-05-11':'2018-06-10'])
方法 | 作用 | 适用场景 | 关键参数 |
|---|---|---|---|
| 按频率重新采样数据 | 统计聚合(求和/均值等) |
|
| 将时间戳转换为时期对象 | 按周期显示数据 |
|
import pandas as pd
# 读取数据并设置日期索引
df = pd.read_excel('TB2018.xls', usecols=['订单付款时间','买家实际支付金额'])
df = df.set_index(pd.to_datetime(df['订单付款时间'])) # 确保日期为索引assert isinstance(df.index, pd.DatetimeIndex), "索引必须为日期类型!"频率代码 | 说明 | 示例 |
|---|---|---|
| 按年统计(年初对齐) | 2018-01-01 |
| 按季统计(季初对齐) | 2018-01-01(Q1) |
| 按月统计(月初对齐) | 2018-01-01 |
| 按周统计(周日对齐) | 每周日作为周期终点 |
| 按天统计 | 每日数据 |
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
aa =r'TB2018.xls'
df = pd.DataFrame(pd.read_excel(aa))
df1=df[['订单付款时间','买家会员名','联系手机','买家实际支付金额']]
df1 = df1.set_index('订单付款时间') # 将date设置为index
print('---------按年统计数据-----------')
#“AS”是每年第一天为开始日期,“A”是每年最后一天
print(df1.resample('AS').sum())
print('---------按季统计数据-----------')
#“QS”是每个季度第一天为开始日期,“Q”是每个季度最后一天
print(df1.resample('QS').sum())
print('---------按月统计数据-----------')
#“MS”是每个月第一天为开始日期,“M”是每个月最后一天
print(df1.resample('MS').sum())
print('---------按星期统计数据-----------')
print(df1.resample('W').sum())
print('---------按天统计数据-----------')
print(df1.resample('D').sum())
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
aa =r'TB2018.xls'
df = pd.DataFrame(pd.read_excel(aa))
df1=df[['订单付款时间','买家会员名','联系手机','买家实际支付金额']]
df1 = df1.set_index('订单付款时间') # 将date设置为index
print('---------按年统计并显示数据-----------')
#“AS”是每年第一天为开始日期,“A”是每年最后一天
print(df1.resample('AS').sum().to_period('A'))
print('---------按季度统计并显示数据-----------')
print(df1.resample('Q').sum().to_period('Q'))
print('---------按月统计并显示数据-----------')
print(df1.resample('M').sum().to_period('M'))
df2=df1.resample('M').sum().to_period('M')
print('---------按星期统计并显示数据-----------')
print(df1.resample('W').sum().to_period('W').head())
tz_localize统一时区后再进行统计sort_index()提升处理效率to_period()的freq参数必须与resample规则匹配原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。