Pandas pd.to_datetime() 函数
pd.to_datetime() 是 Pandas 库中用于将数据转换为日期时间类型的函数。它可以将字符串、Unix 时间戳等多种格式的数据转换为 Pandas 的 datetime64 类型。
日期时间处理是数据分析中的常见任务,转换为 datetime 类型后,可以方便地进行日期提取、时间运算、时区处理等操作。
单词释义: to_datetime 意为"转换为日期时间",即把各种格式的时间数据统一转换为标准的 datetime 对象。
基本语法与参数
pd.to_datetime() 是 Pandas 库的顶级函数,用于将各种格式的时间数据转换为 datetime 类型。
语法格式
pd.to_datetime(arg, errors='raise', dayfirst=False, yearfirst=False, utc=False, format=None, unit='ns')
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| arg | 整数、浮点数、字符串、datetime、列表、Series | 要转换为日期时间类型的数据。 |
| errors | 字符串 | 错误处理方式:'raise'(默认)抛异常;'coerce'转NaT;'ignore'返回原数据。 |
| dayfirst | 布尔值 | True 则日期放在月份前面(如 01/02/2023 表示 2 号)。 |
| utc | 布尔值 | True 则返回 UTC 时区的 datetime。 |
| format | 字符串 | 指定日期时间格式,如 '%Y-%m-%d'。 |
| unit | 字符串 | 当 arg 是数值时,指定单位:'D', 's', 'ms', 'us', 'ns'。 |
返回值说明
- 返回值: 返回一个 datetime64 类型的 Series。
- 效果: 将输入数据转换为 Pandas 的 datetime 类型,便于进行日期时间操作。
实例
让我们通过一系列从简单到复杂的例子,彻底掌握 pd.to_datetime() 的用法。
示例 1:基础用法 - 将字符串转换为日期时间
实例
import pandas as pd
# 1. 创建日期时间字符串 Series
dates = pd.Series([
'2023-01-01',
'2023-01-02',
'2023-01-03',
'2023-01-04',
'2023-01-05'
])
print("=== 原始 Series(类型:", dates.dtype, ")===")
print(dates)
# 2. 使用 pd.to_datetime() 转换为日期时间类型
result = pd.to_datetime(dates)
print("\n=== pd.to_datetime() 转换后(类型:", result.dtype, ")===")
print(result)
# 3. 支持多种格式
dates_mixed = pd.Series([
'2023-01-01',
'2023/02/03',
'01.04.2023',
'2023年05月06日'
])
print("\n=== 多种格式自动解析 ===")
print(pd.to_datetime(dates_mixed))
# 4. 包含时间的信息
dates_with_time = pd.Series([
'2023-01-01 12:30:45',
'2023-02-03 08:15:30'
])
result_datetime = pd.to_datetime(dates_with_time)
print("\n=== 包含时间的信息 ===")
print(result_datetime)
# 1. 创建日期时间字符串 Series
dates = pd.Series([
'2023-01-01',
'2023-01-02',
'2023-01-03',
'2023-01-04',
'2023-01-05'
])
print("=== 原始 Series(类型:", dates.dtype, ")===")
print(dates)
# 2. 使用 pd.to_datetime() 转换为日期时间类型
result = pd.to_datetime(dates)
print("\n=== pd.to_datetime() 转换后(类型:", result.dtype, ")===")
print(result)
# 3. 支持多种格式
dates_mixed = pd.Series([
'2023-01-01',
'2023/02/03',
'01.04.2023',
'2023年05月06日'
])
print("\n=== 多种格式自动解析 ===")
print(pd.to_datetime(dates_mixed))
# 4. 包含时间的信息
dates_with_time = pd.Series([
'2023-01-01 12:30:45',
'2023-02-03 08:15:30'
])
result_datetime = pd.to_datetime(dates_with_time)
print("\n=== 包含时间的信息 ===")
print(result_datetime)
运行结果:
=== 原始 Series(类型: object )=== 0 2023-01-01 1 2023-01-02 2 2023-01-03 3 2023-01-04 4 2023-01-05 dtype: object === pd.to_datetime() 转换后(类型: datetime64[ns] )=== 0 2023-01-01 00:00:00 1 2023-01-02 00:00:00 2 2023-01-03 00:00:00 3 2023-01-04 00:00:00 4 2023-01-05 00:00:00 === 多种格式自动解析 === 0 2023-01-01 00:00:00 1 2023-02-03 00:00:00 2 2023-04-01 00:00:00 3 2023-05-06 00:00:00 === 包含时间的信息 === 0 2023-01-01 12:30:45 1 2023-02-03 08:15:30
代码解析:
pd.to_datetime()能够自动识别多种常见的日期时间格式。- 即使输入只包含日期,时间部分也会默认填充为 00:00:00。
- 能够处理包含中文、点号、斜杠等不同分隔符的日期格式。
示例 2:处理不同日期格式和 dayfirst 参数
对于不同地区的日期格式,可以使用 dayfirst 参数或 format 参数。
实例
import pandas as pd
# 1. 欧洲格式的日期(月/日/年)
europe_dates = pd.Series(['01/02/2023', '02/03/2023', '03/04/2023'])
print("=== 欧洲格式日期(01/02/2023 理解为 2 号)===")
print("默认(月/日/年):", pd.to_datetime(europe_dates).dt.day.tolist())
print("dayfirst=True:", pd.to_datetime(europe_dates, dayfirst=True).dt.day.tolist())
# 2. 使用 format 参数指定具体格式
print("\n=== 使用 format 参数 ===")
result = pd.to_datetime('2023-06-15 14:30:00', format='%Y-%m-%d %H:%M:%S')
print(f"转换结果: {result}")
# 3. 复杂格式解析
complex_dates = pd.Series(['2023年12月25日', '15/08/2023', '2023-05-01'])
print("\n=== 混合格式自动解析 ===")
print(pd.to_datetime(complex_dates, dayfirst=True))
# 1. 欧洲格式的日期(月/日/年)
europe_dates = pd.Series(['01/02/2023', '02/03/2023', '03/04/2023'])
print("=== 欧洲格式日期(01/02/2023 理解为 2 号)===")
print("默认(月/日/年):", pd.to_datetime(europe_dates).dt.day.tolist())
print("dayfirst=True:", pd.to_datetime(europe_dates, dayfirst=True).dt.day.tolist())
# 2. 使用 format 参数指定具体格式
print("\n=== 使用 format 参数 ===")
result = pd.to_datetime('2023-06-15 14:30:00', format='%Y-%m-%d %H:%M:%S')
print(f"转换结果: {result}")
# 3. 复杂格式解析
complex_dates = pd.Series(['2023年12月25日', '15/08/2023', '2023-05-01'])
print("\n=== 混合格式自动解析 ===")
print(pd.to_datetime(complex_dates, dayfirst=True))
运行结果:
=== 欧洲格式日期(01/02/2023 理解为 2 号)=== 默认: [1, 2, 3] dayfirst=True: [2, 3, 4] === 使用 format 参数 === 转换结果: 2023-06-15 14:30:00 === 混合格式自动解析 === 0 2023-12-25 00:00:00 1 2023-08-15 00:00:00 2 2023-05-01 00:00:00
代码解析:
format参数指定具体格式能够明确告诉 Pandas 如何解析日期,避免歧义。- 自动解析能力很强,但在有歧义时(如理解 01/02/2023),需要使用
dayfirst或format参数明确指定。
示例 3:将 Unix 时间戳转换为日期时间
从数据库或系统导出的时间戳可以使用 unit 参数转换。
实例
import pandas as pd
# 1. Unix 时间戳(秒)
timestamps = pd.Series([1672531200, 1672617600, 1672704000])
print("=== Unix 时间戳(秒)===")
print(timestamps.values)
# 2. 转换为日期时间
result = pd.to_datetime(timestamps, unit='s')
print("\n=== pd.to_datetime(..., unit='s') 转换后 ===")
print(result)
# 3. Unix 时间戳(毫秒)
timestamps_ms = pd.Series([1672531200000, 1672617600000, 1672704000000])
result_ms = pd.to_datetime(timestamps_ms, unit='ms')
print("\n=== 毫秒级时间戳 ===")
print(result_ms)
# 4. 从固定原点转换
print("\n=== 从 2023-01-01 开始计算 ===")
days = pd.Series([0, 1, 2, 3, 4])
result_origin = pd.to_datetime(days, origin='2023-01-01', unit='D')
print(result_origin)
# 1. Unix 时间戳(秒)
timestamps = pd.Series([1672531200, 1672617600, 1672704000])
print("=== Unix 时间戳(秒)===")
print(timestamps.values)
# 2. 转换为日期时间
result = pd.to_datetime(timestamps, unit='s')
print("\n=== pd.to_datetime(..., unit='s') 转换后 ===")
print(result)
# 3. Unix 时间戳(毫秒)
timestamps_ms = pd.Series([1672531200000, 1672617600000, 1672704000000])
result_ms = pd.to_datetime(timestamps_ms, unit='ms')
print("\n=== 毫秒级时间戳 ===")
print(result_ms)
# 4. 从固定原点转换
print("\n=== 从 2023-01-01 开始计算 ===")
days = pd.Series([0, 1, 2, 3, 4])
result_origin = pd.to_datetime(days, origin='2023-01-01', unit='D')
print(result_origin)
运行结果:
=== Unix 时间戳(秒)=== [1672531200 1672617600 1672704000] === pd.to_datetime(..., unit='s') 转换后 === 0 2023-01-01 00:00:00 1 2023-01-02 00:00:00 2 2023-01-03 00:00:00 === 毫秒级时间戳 === 0 2023-01-01 00:00:00 1 2023-01-02 00:00:00 2 2023-01-03 00:00:00 === 从 2023-01-01 开始计算 === 0 2023-01-01 1 2023-01-02 2 2023-01-03 3 2023-01-04 4 2023-01-05
代码解析:
unit='s'表示数值单位是秒(Unix 时间戳)。unit='ms'表示毫秒时间戳。origin参数可以指定起始时间,用于计算相对时间。
示例 4:errors 参数处理无效日期
实例
import pandas as pd
import numpy as np
# 1. 包含无效日期的 Series
mixed_dates = pd.Series(['2023-01-01', '2023-02-30', 'invalid', '2023-03-15'])
print("=== 包含无效日期的 Series ===")
print(mixed_dates)
# 2. errors='raise'(默认)- 抛出异常
print("\n=== errors='raise' ===")
try:
pd.to_datetime(mixed_dates, errors='raise')
except Exception as e:
print(f"异常: {type(e).__name__}")
# 3. errors='coerce' - 将无效日期转为 NaT
print("\n=== errors='coerce' ===")
result = pd.to_datetime(mixed_dates, errors='coerce')
print(result)
# 4. errors='ignore' - 保持原样
print("\n=== errors='ignore' ===")
result_ignore = pd.to_datetime(mixed_dates, errors='ignore')
print(result_ignore)
print(f"类型: {result_ignore.dtype}")
import numpy as np
# 1. 包含无效日期的 Series
mixed_dates = pd.Series(['2023-01-01', '2023-02-30', 'invalid', '2023-03-15'])
print("=== 包含无效日期的 Series ===")
print(mixed_dates)
# 2. errors='raise'(默认)- 抛出异常
print("\n=== errors='raise' ===")
try:
pd.to_datetime(mixed_dates, errors='raise')
except Exception as e:
print(f"异常: {type(e).__name__}")
# 3. errors='coerce' - 将无效日期转为 NaT
print("\n=== errors='coerce' ===")
result = pd.to_datetime(mixed_dates, errors='coerce')
print(result)
# 4. errors='ignore' - 保持原样
print("\n=== errors='ignore' ===")
result_ignore = pd.to_datetime(mixed_dates, errors='ignore')
print(result_ignore)
print(f"类型: {result_ignore.dtype}")
运行结果:
=== 包含无效日期的 Series === 0 2023-01-01 1 2023-02-30 2 invalid 3 2023-03-15 === errors='raise' === 异常: OutOfBoundsDatetime === errors='coerce' === 0 2023-01-01 00:00:00 1 NaT 2 NaT 3 2023-03-15 00:00:00 === errors='ignore' === 0 2023-01-01 1 2023-02-30 2 invalid 3 2023-03-15 dtype: object
代码解析:
errors='coerce'将无效日期和无法解析的值都转为 NaT(Not a Time,等同于缺失值)。- 这在处理脏数据时非常有用,可以保持数据处理的连续性。
注意事项
重要提示:
- 如果数据中有值超出 datetime 范围,会抛出
OutOfBoundsDatetime异常。format参数能够明确指定日期格式,建议在处理大量数据时使用以提高性能。- 转换后的 datetime 对象可以使用
.dt访问器进行丰富的日期时间操作。- 时区处理需要安装
pytz库。

Pandas 常用函数