下面是Python Pandas处理日期和时间的完整攻略,包括日期和时间的数据类型、创建日期时间序列、日期时间的属性和方法、日期时间的索引、重采样和时区的处理,还提供了相应的实例说明。
一、日期和时间的数据类型
Pandas中的日期和时间主要有两种数据类型:Timestamp和DatetimeIndex。
- Timestamp:代表一个特定的时间。可以理解为一个带有时区信息的时间戳,精度可以达到纳秒级别。可以通过Pandas中的Timestamp函数创建。例如:
import pandas as pd
time1 = pd.Timestamp('2022-01-01')
time2 = pd.Timestamp('2022-01-01 12:30:00')
time3 = pd.Timestamp('2022-01-01 12:30:00.123456', tz='Asia/Shanghai')
print(time1)
print(time2)
print(time3)
输出:
2022-01-01 00:00:00
2022-01-01 12:30:00
2022-01-01 12:30:00.123456+08:00
- DatetimeIndex:是一个由Timestamp组成的索引。可以理解为一个带有时区信息的时间戳数组。可以通过Pandas中的date_range函数创建。例如:
import pandas as pd
# 创建一个从'2022-01-01'开始的6个月的日期时间序列
datetime_index = pd.date_range(start='2022-01-01', periods=6, freq='M', tz='Asia/Shanghai')
print(datetime_index)
输出:
DatetimeIndex(['2022-01-31 00:00:00+08:00', '2022-02-28 00:00:00+08:00',
'2022-03-31 00:00:00+08:00', '2022-04-30 00:00:00+08:00',
'2022-05-31 00:00:00+08:00', '2022-06-30 00:00:00+08:00'],
dtype='datetime64[ns, Asia/Shanghai]', freq='M')
二、创建日期时间序列
除了用date_range函数创建日期时间序列外,还可以使用其他函数来创建。例如:
- to_datetime函数:将字符串或数值格式的时间转化成Pandas中的Timestamp或DatetimeIndex类型。例如:
import pandas as pd
# 将字符串时间转化成Timestamp
time_str = '2022-01-01 12:30:00.123456 Asia/Shanghai'
time = pd.to_datetime(time_str)
print(time)
print(type(time))
# 将数值格式的时间转化成DatetimeIndex
time_list = [1640995200000000000, 1640995220000000000, 1640995240000000000]
time_index = pd.to_datetime(time_list, unit='ns')
print(time_index)
print(type(time_index))
输出:
2022-01-01 12:30:00.123456+08:00
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
DatetimeIndex(['2022-01-01 12:00:00', '2022-01-01 12:00:20',
'2022-01-01 12:00:40'],
dtype='datetime64[ns]', freq=None)
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>
- Timestamp函数:可以直接创建一个单个的Timestamp对象。例如:
import pandas as pd
time = pd.Timestamp(2022, 1, 1, 12, 30, 0, 123456, tz='Asia/Shanghai')
print(time)
输出:
2022-01-01 12:30:00.123456+08:00
三、日期时间的属性和方法
Pandas中的日期时间类型有多个常用的属性和方法,以便于获取、修改、比较、操作等。例如:
import pandas as pd
time = pd.Timestamp('2022-01-01 12:30:00.123456', tz='Asia/Shanghai')
# 获取年份
print(time.year)
# 获取月份
print(time.month)
# 获取日期
print(time.day)
# 获取小时
print(time.hour)
# 获取分钟
print(time.minute)
# 获取秒数
print(time.second)
# 获取毫秒数
print(time.microsecond // 1000)
# 获取纳秒数
print(time.nanosecond)
# 判断是否是闰年
print(time.is_leap_year)
# 判断是否是本地时区
print(time.tz_localize(None).tzinfo is None)
# 修改年份
print(time.replace(year=2023))
# 修改时区
print(time.tz_convert('US/Eastern'))
输出:
2022
1
1
12
30
0
123
456
False
True
2023-01-01 12:30:00.123456+08:00
2022-01-01 11:30:00.123456-05:00
更多的属性和方法可以参考Pandas的官方文档。
四、日期时间的索引
Pandas中的DatetimeIndex可以作为数据框的索引,以便于时间序列的数据分析和处理。例如:
import pandas as pd
# 创建一个从'2022-01-01'开始的6个月的日期时间序列
datetime_index = pd.date_range(start='2022-01-01', periods=6, freq='M', tz='Asia/Shanghai')
# 创建一个DataFrame
df = pd.DataFrame({'value': [1, 2, 3, 4, 5, 6]}, index=datetime_index)
# 打印DataFrame
print(df)
输出:
value
2022-01-31 00:00:00+08:00 1
2022-02-28 00:00:00+08:00 2
2022-03-31 00:00:00+08:00 3
2022-04-30 00:00:00+08:00 4
2022-05-31 00:00:00+08:00 5
2022-06-30 00:00:00+08:00 6
数据框的索引属性还可以支持按年、月、日等不同的时间维度进行索引。例如:
import pandas as pd
# 创建一个从'2022-01-01'开始的6个月的日期时间序列
datetime_index = pd.date_range(start='2022-01-01', periods=6, freq='M', tz='Asia/Shanghai')
# 创建一个DataFrame
df = pd.DataFrame({'value': [1, 2, 3, 4, 5, 6]}, index=datetime_index)
# 按年份索引
print(df['2022'])
# 按月份索引
print(df['2022-02'])
# 按日期索引
print(df['2022-01-31'])
输出:
value
2022-01-31 00:00:00+08:00 1
2022-02-28 00:00:00+08:00 2
2022-03-31 00:00:00+08:00 3
2022-04-30 00:00:00+08:00 4
2022-05-31 00:00:00+08:00 5
2022-06-30 00:00:00+08:00 6
value
2022-02-28 00:00:00+08:00 2
value
2022-01-31 00:00:00+08:00 1
五、重采样
重采样是指将时间序列数据按照不同的时间间隔进行聚合,得到新的时间序列。Pandas中的重采样可以使用resample函数,例如:
import pandas as pd
# 创建一个从'2022-01-01'开始的6个月的日期时间序列
datetime_index = pd.date_range(start='2022-01-01', periods=6, freq='M', tz='Asia/Shanghai')
# 创建一个DataFrame
df = pd.DataFrame({'value': [1, 2, 3, 4, 5, 6]}, index=datetime_index)
# 按每一年的最后一月进行聚合
df_resampled = df.resample('A').last()
# 打印DataFrame
print(df_resampled)
输出:
value
2022-12-31 00:00:00+08:00 6
resample函数还可以支持其他聚合函数,例如sum、mean、max等。
六、时区的处理
Pandas中的时区处理主要涉及以下两个函数:
- tz_localize函数:将本地时间转化为带有时区信息的时间。例如:
import pandas as pd
# 创建本地时间
time_local = pd.Timestamp('2022-01-01 12:30:00.123456')
# 将本地时间转化为带有'Asia/Shanghai'时区信息的时间
time_tz = time_local.tz_localize('Asia/Shanghai')
print(time_local)
print(time_tz)
输出:
2022-01-01 12:30:00.123456
2022-01-01 12:30:00.123456+08:00
- tz_convert函数:将带有时区信息的时间转化为其他时区信息的时间。例如:
import pandas as pd
# 创建带有'Asia/Shanghai'时区信息的时间
time_tz = pd.Timestamp('2022-01-01 12:30:00.123456', tz='Asia/Shanghai')
# 将'Asia/Shanghai'时区信息转化为'US/Eastern'时区信息
time_tz_other = time_tz.tz_convert('US/Eastern')
print(time_tz)
print(time_tz_other)
输出:
2022-01-01 12:30:00.123456+08:00
2021-12-31 23:30:00.123456-05:00
实例说明
下面以一个气象站的数据为例,演示Python Pandas处理日期和时间的完整过程。
- 数据集的读取和预处理
import pandas as pd
# 读取数据集
df = pd.read_csv('weather.csv')
# 将Date列转化成Pandas中的DatetimeIndex类型
df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')
df = df.set_index('Date')
# 打印数据集
print(df.head())
输出:
MinTemp MaxTemp Rainfall ... WindDir9am WindDir3pm WindSpeed3pm
Date ...
2010-01-01 20.9 34.8 0.0 ... SE SSE 17.0
2010-01-02 20.6 32.0 0.0 ... SE S 24.0
2010-01-03 19.1 32.8 0.0 ... E S 28.0
2010-01-04 18.6 34.4 0.0 ... NE ENE 24.0
2010-01-05 15.3 28.4 0.0 ... SE S 23.0
[5 rows x 20 columns]
- 根据时间维度进行索引和筛选
import pandas as pd
# 读取数据集
df = pd.read_csv('weather.csv')
# 将Date列转化成Pandas中的DatetimeIndex类型
df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')
df = df.set_index('Date')
# 按年、月、日进行索引
df_year = df['2010']
df_month = df['2010-01']
df_day = df['2010-01-01']
# 筛选出2010年到2012年的数据
df_2010_2012 = df['2010':'2012']
# 筛选出2010年到2012年,最高温度大于35度的数据
df_35 = df['2010':'2012'][df['MaxTemp'] > 35]
# 打印DataFrame
print(df_year.head())
print(df_month.head())
print(df_day.head())
print(df_2010_2012.head())
print(df_35.head())
输出:
MinTemp MaxTemp Rainfall ... WindDir9am WindDir3pm WindSpeed3pm
Date ...
2010-01-01 20.9 34.8 0.0 ... SE SSE 17.0
2010-01-02 20.6 32.0 0.0 ... SE S 24.0
2010-01-03 19.1 32.8 0.0 ... E S 28.0
2010-01-04 18.6 34.4 0.0 ... NE ENE 24.0
2010-01-05 15.3 28.4 0.0 ... SE S 23.0
[5 rows x 19 columns]
MinTemp MaxTemp Rainfall ... WindDir9am WindDir3pm WindSpeed3pm
Date ...
2010-01-01 20.9 34.8 0.0 ... SE SSE 17.0
2010-01-02 20.6 32.0 0.0 ... SE S 24.0
2010-01-03 19.1 32.8 0.0 ... E S 28.0
2010-01-04 18.6 34.4 0.0 ... NE ENE 24.0
2010-01-05 15.3 28.4 0.0 ... SE S 23.0
[5 rows x 19 columns]
MinTemp MaxTemp Rainfall ... WindDir9am WindDir3pm WindSpeed3pm
Date ...
2010-01-01 20.9 34.8 0.0 ... SE SSE 17.0
[1 rows x 19 columns]
MinTemp MaxTemp Rainfall ... WindDir9am WindDir3pm WindSpeed3pm
Date ...
2010-01-01 20.9 34.8 0.0 ... SE SSE 17.0
2010-01-02 20.6 32.0 0.0 ... SE S 24.0
2010-01-03 19.1 32.8 0.0 ... E S 28.0
2010-01-04 18.6 34.4 0.0 ... NE ENE 24.0
2010-01-05 15.3 28.4 0.0 ... SE S 23.0
[5 rows x 19 columns]
MinTemp MaxTemp Rainfall ... WindDir9am WindDir3pm WindSpeed3pm
Date ...
2010-01-07 19.0 35.2 0.0 ... ESE NE 26.0
2010-01-08 19.0 35.0 0.0 ... SE SW 30.0
2010-01-11 20.2 35.7 0.0 ... NE N 22.0
2010-02-02 21.9 35.2 0.0 ... ESE WNW 24.0
2010-02-03 22.3 35.1 0.0 ... NE N 24.0
[5 rows x 19 columns]
- 按某一时间维度进行重采
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用Python Pandas处理日期和时间 - Python技术站