文章

Pandas 时间类型及转换

Pandas 三种时间类型的转换关系

Pandas 的时间类型之间可以互相转换。以下是它们之间的关系和常用操作:


1. datetime64Timestamp 的关系

  • datetime64 是底层类型,用来表示时间点。
  • Timestampdatetime64 的封装,提供更多方法和属性。

转换方法

  • datetime64Timestampdatetime64 中的每个时间值在操作时会自动转为 Timestamp
  • Timestampdatetime64:在 DataFrame 中,Timestamp 会自动存储为 datetime64

示例

1
2
3
4
5
6
7
8
9
import pandas as pd

# datetime64 类型列
df = pd.DataFrame({'时间': pd.to_datetime(['2024-11-08 12:00:00', '2024-11-09 08:30:00'])})
print(type(df['时间'].iloc[0]))  # 输出:<class 'pandas._libs.tslibs.timestamps.Timestamp'>

# 直接用 Timestamp 创建
timestamp = pd.Timestamp('2024-11-08 12:00:00')
print(type(timestamp))  # 输出:<class 'pandas._libs.tslibs.timestamps.Timestamp'>

2. datetime64Timedelta 的关系

  • Timedelta 可以加减到 datetime64 类型,表示时间的偏移。
  • 两个 datetime64 相减会返回一个 Timedelta 类型。

示例

1
2
3
4
5
6
# datetime64 加减 timedelta
df['时间+8小时'] = df['时间'] + pd.Timedelta(hours=8)

# 计算时间差
df['时间差'] = df['时间'].diff()  # 结果为 Timedelta 类型
print(df['时间差'].iloc[1])  # 输出:1 days 20:30:00

3. TimestampTimedelta 的关系

  • TimestampTimedelta 的关系类似于 datetime64Timedelta
    • Timestamp + Timedelta 会返回一个新的时间点。
    • 两个 Timestamp 相减会返回 Timedelta

示例

1
2
3
4
5
6
7
8
9
10
timestamp = pd.Timestamp('2024-11-08 12:00:00')
timedelta = pd.Timedelta(days=2)

# 加减运算
new_timestamp = timestamp + timedelta
print(new_timestamp)  # 输出:2024-11-10 12:00:00

# 时间差
time_diff = pd.Timestamp('2024-11-10 12:00:00') - timestamp
print(time_diff)  # 输出:2 days 00:00:00

常见属性和方法

以下是 datetime64TimedeltaTimestamp 的常用属性和方法:

1. datetime64Timestamp

  • 属性
    • .year:年份
    • .month:月份
    • .day:日期
    • .hour:小时
    • .minute:分钟
    • .second:秒
    • .dayofweek:星期几(0 表示星期一,6 表示星期日)
    • .is_month_start / .is_month_end:是否为月初/月底
    • .tz:时区信息
    • .date / .time:只返回日期或时间部分
  • 方法
    • .strftime(format):格式化日期时间为字符串。
    • .to_pydatetime():转换为 Python 的 datetime 对象。
    • .floor(freq):向下取整到指定的时间单位。
    • .ceil(freq):向上取整到指定的时间单位。
    • .round(freq):四舍五入到指定的时间单位。

示例

1
2
3
4
5
6
7
8
9
timestamp = pd.Timestamp('2024-11-08 12:30:45')

# 属性
print(timestamp.year)  # 输出:2024
print(timestamp.dayofweek)  # 输出:4(星期五)

# 方法
print(timestamp.strftime('%Y-%m-%d'))  # 输出:2024-11-08
print(timestamp.floor('H'))  # 输出:2024-11-08 12:00:00

2. Timedelta

  • 属性
    • .days:总天数。
    • .seconds:不足一天的秒数。
    • .microseconds:不足一秒的微秒数。
    • .total_seconds():返回总秒数(包括天数转换的秒数)。
  • 方法
    • .to_pytimedelta():转换为 Python 的 timedelta 对象。
    • .round(freq):四舍五入到指定的时间单位。

示例

1
2
3
4
5
6
7
8
9
timedelta = pd.Timedelta(days=1, hours=5, minutes=30)

# 属性
print(timedelta.days)  # 输出:1
print(timedelta.seconds)  # 输出:19800(5小时30分钟)
print(timedelta.total_seconds())  # 输出:111000.0

# 方法
print(timedelta.to_pytimedelta())  # 输出:1 day, 5:30:00

转换总结

操作结果类型
datetime64 加减 Timedeltadatetime64Timestamp
两个 datetime64 / Timestamp 相减Timedelta
创建 TimedeltaTimedelta
Timestamp 转为 Python datetimedatetime.datetime
Timedelta 转为 Python timedeltadatetime.timedelta

有了这些知识,你可以轻松操作和转换 Pandas 的时间类型数据!

好像还有一个combine,我没写

本文由作者按照 CC BY 4.0 进行授权