Pandas 三种时间类型的转换关系
Pandas 的时间类型之间可以互相转换。以下是它们之间的关系和常用操作:
1. datetime64 和 Timestamp 的关系
datetime64 是底层类型,用来表示时间点。Timestamp 是 datetime64 的封装,提供更多方法和属性。
转换方法
datetime64 → Timestamp:datetime64 中的每个时间值在操作时会自动转为 Timestamp。Timestamp → datetime64:在 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. datetime64 和 Timedelta 的关系
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. Timestamp 和 Timedelta 的关系
Timestamp 和 Timedelta 的关系类似于 datetime64 和 Timedelta: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
|
常见属性和方法
以下是 datetime64、Timedelta 和 Timestamp 的常用属性和方法:
1. datetime64 和 Timestamp
- 属性:
.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 加减 Timedelta | datetime64 或 Timestamp |
两个 datetime64 / Timestamp 相减 | Timedelta |
创建 Timedelta | Timedelta |
Timestamp 转为 Python datetime | datetime.datetime |
Timedelta 转为 Python timedelta | datetime.timedelta |
有了这些知识,你可以轻松操作和转换 Pandas 的时间类型数据!
好像还有一个combine,我没写