现在位置: 首页 > Pandas 教程 > 正文

Pandas pd.to_datetime() 函数

Pandas 通用函数 Pandas 常用函数


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)

运行结果:

=== 原始 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

代码解析:

  1. pd.to_datetime() 能够自动识别多种常见的日期时间格式。
  2. 即使输入只包含日期,时间部分也会默认填充为 00:00:00。
  3. 能够处理包含中文、点号、斜杠等不同分隔符的日期格式。

示例 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))

运行结果:

=== 欧洲格式日期(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),需要使用 dayfirstformat 参数明确指定。

示例 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)

运行结果:

=== 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}")

运行结果:

=== 包含无效日期的 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 库。

Python math 模块 Pandas 常用函数