欢迎访问宙启技术站
智能推送

如何使用python函数进行时间处理和时间序列分析?

发布时间:2023-05-21 01:32:44

时间是数据领域中非常重要的一个维度,因为时间可以影响数据的趋势、周期性和季节性等因素。在Python中,处理时间的模块很多,比如datetime、time、calendar、dateutil、pandas等。本文将着重介绍datetime和pandas模块的使用。

一、datetime模块

datetime模块提供了一组方法和类来处理日期和时间。常见的类有date、datetime、time、timedelta等。其中datetime是最灵活和常用的类。

1. 创建datetime对象

datetime对象的构造函数为datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)。其中year、month、day必须指定,其他参数可选。tzinfo表示时区信息,默认为None,即本地时区。示例代码如下:

from datetime import datetime

now = datetime.now()
print(now)

dt = datetime(2022, 1, 1)
print(dt)

dt2 = datetime(2022, 1, 1, 12, 30)
print(dt2)

输出结果:

2022-09-22 10:29:48.811946
2022-01-01 00:00:00
2022-01-01 12:30:00

2. datetime对象与字符串的转换

datetime对象和字符串之间可以相互转换。常用的转换函数有strftime和strptime。

strftime可以将datetime对象格式化为字符串,其语法为strftime(format)。其中format参数是一个字符串,表示要输出的格式。示例代码如下:

dt = datetime(2022, 1, 1, 12, 30)
print(dt.strftime('%Y-%m-%d %H:%M:%S'))

dt2 = datetime.now()
print(dt2.strftime('%Y-%m-%d %H:%M:%S'))

输出结果:

2022-01-01 12:30:00
2022-09-22 10:29:48

strptime可以将字符串解析为datetime对象,其语法为strptime(date_string, format)。其中date_string是一个字符串,表示要解析的日期时间字符串,format参数是一个字符串,表示date_string的格式。示例代码如下:

dt_str = '2022-01-01 12:30:00'
dt = datetime.strptime(dt_str, '%Y-%m-%d %H:%M:%S')
print(dt)

dt_str2 = '2022/01/01 12:30:00'
dt2 = datetime.strptime(dt_str2, '%Y/%m/%d %H:%M:%S')
print(dt2)

输出结果:

2022-01-01 12:30:00
2022-01-01 12:30:00

3. datetime对象的运算

datetime对象支持加减运算,可以通过timedelta类来定义时间间隔。示例代码如下:

from datetime import timedelta

now = datetime.now()
print(now)

delta = timedelta(days=10, hours=12)
print(now + delta)

delta2 = timedelta(hours=-8)
print(now + delta2)

输出结果:

2022-09-22 10:29:48.831581
2022-10-03 22:29:48.831581
2022-09-22 02:29:48.831581

4. datetime对象的比较

datetime对象可以通过比较运算符来比较大小,比较规则为先比较年份,再比较月份,最后比较日期。示例代码如下:

dt1 = datetime(2022, 1, 1)
dt2 = datetime(2022, 1, 2)

print(dt1 < dt2)
print(dt1 == dt2)

输出结果:

True
False

二、pandas模块

pandas是一种开源的数据分析和处理工具,支持时间序列的操作和统计分析。pandas中用Timestamp类型来表示时间戳,用DatetimeIndex来表示时间序列。

1. 创建时间序列

在pandas中,可以使用pd.to_datetime函数将字符串转换为Timestamp类型,并通过list和Series来创建时间序列。示例代码如下:

import pandas as pd

date_str = ['2019-01-01', '2019-01-02', '2019-01-03']
date_index = pd.to_datetime(date_str)

print(date_index)

data = [1, 2, 3]
s = pd.Series(data, index=date_index)
print(s)

输出结果:

DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03'], dtype='datetime64[ns]', freq=None)
2019-01-01    1
2019-01-02    2
2019-01-03    3
dtype: int64

2. 时间序列的切片和筛选

在pandas中,可以使用切片和索引来筛选时间序列中的数据。示例代码如下:

import pandas as pd

date_str = ['2019-01-01', '2019-01-02', '2019-01-03']
date_index = pd.to_datetime(date_str)

data = [1, 2, 3]
s = pd.Series(data, index=date_index)

print(s['2019-01-01'])

print(s['2019-01-01':'2019-01-02'])

输出结果:

1
2019-01-01    1
2019-01-02    2
dtype: int64

3. 时间序列的重采样

重采样是指将时间序列从一个频率转换为另一个频率的过程。在pandas中,可以使用resample函数来实现。resample函数的常见参数有rule、how和closed。rule表示重采样的频率,如D表示天,H表示小时。how表示重采样的方法,如sum表示求和,mean表示求平均值。closed表示区间的闭合方式,如left表示左闭右开区间,right表示右闭左开区间。示例代码如下:

import pandas as pd

date_index = pd.date_range(start='2022-01-01', end='2022-01-10', freq='D')
data = list(range(10))
s = pd.Series(data, index=date_index)

sum_resampled = s.resample('2D').sum()
print(sum_resampled)

mean_resampled = s.resample('2D', closed='right').mean()
print(mean_resampled)

输出结果:

2022-01-01     1
2022-01-03     5
2022-01-05     9
2022-01-07    13
2022-01-09    17
Freq: 2D, dtype: int64
2021-12-31    0.5
2022-01-02    2.5
2022-01-04    4.5
2022-01-06    6.5
2022-01-08    8.5
Freq: 2D, dtype: float64

4. 时间序列的移动平均

移动平均是一种平滑时间序列的方法,可以消除噪声和抖动。在pandas中,可以使用rolling函数来实现。rolling函数的常见参数有window和center。window表示移动窗口的大小,center表示移动窗口的位置是否居中。示例代码如下:

import pandas as pd

date_index = pd.date_range(start='2022-01-01', end='2022-01-10', freq='D')
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
s = pd.Series(data, index=date_index)

rolling_mean = s.rolling(window=3).mean()
print(rolling_mean)

输出结果:

`

2022-01-01 NaN

2022-01-02 NaN

2022-01-03 2.000000

2022-01-04 3.000000

2022-01-05 4.000000

2022-01-06 5.000000