Pandas时间相关的方法

2023-12-14 16:54:58

在处理时序数据时,pandas提供了许多好用的方法,这里总结一些常用的。

一、准备工作

首先,我们得有一个包含时间列的数据。以读取表格为例,很多时候你的时间列可能会被识别为字符串。因此,我们需要将其进行转换。

? ? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 时序数据示例

1、读取表格时解析

from pandas import read_csv
df = read_csv('test.csv', parse_dates=['时间'])

传参之所以是一个列表,是因为可以解析多个时间列,如parse_dates=['北京时间', '宇宙时间']

2、调用单独的解析方法

from pandas import to_datetime
df['时间'] = to_datetime(df['时间'])

3、自定义解析方法

虽然pandas自带的解析方法能自动处理很多常见的时间表达形式,但不可能完全覆盖,实际的业务永远是未知且多变的。如"2023年12月12日 占位 11:11"

from datetime import datetime


def my_to_datetime(s):
    t = datetime.strptime(s, '%Y年%m月%d日 占位 %H:%M')
    return t


print(my_to_datetime('2023年12月12日 占位 11:11'))

# 输出:
2023-12-12 11:11:00

针对dataframe,可以调用apply方法

df['时间'] = df['时间'].apply(my_to_datetime)

4、生成时间序列

如果数据中没有时间列,但你知道时间的起始,那么可以生成等间隔的时间序列,最后将时间列和数据合并。

# 指定起止时间和间隔,这里是天;如果是十分钟间隔,freq='10T'
times = date_range('2023-01-01', '2023-01-05', freq='d')
print(times)

# 输出:
DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04',
               '2023-01-05'],
              dtype='datetime64[ns]', freq='D')

5、将时间作为索引

df.index = df['时间']

?二、基于时间索引的操作

1、抽样

如表格示例,数据时间范围为2023-01-01到2023-03-31,如果我想将其中一部分数据抽样出来

# 选取一天数据;类似的,df['2023-01']表示选择一个月数据
df['2023-01-01']

# 输出:
                    时间    变量1    变量2    变量3
时间                                                          
2023-01-01 00:00:00 2023-01-01 00:00:00  15.20  12.14  61.58
2023-01-01 00:10:00 2023-01-01 00:10:00  15.19  11.99  61.73
2023-01-01 00:20:00 2023-01-01 00:20:00  15.17  11.57  61.84
...                                 ...    ...    ...    ...
2023-01-01 23:40:00 2023-01-01 23:40:00  16.33  13.04  60.84
2023-01-01 23:50:00 2023-01-01 23:50:00  16.32  12.14  60.18
[144 rows x 4 columns]

2、重采样

如果我们的原始数据采样频率过高,那么可以重采样后降低频率。如毫秒级到秒级,秒级到分钟级等。(当然,也可以提高采样频率,只不过需要填充)

# 示例,一个月求一个均值
df.resample('M').mean()

# 输出:
                  变量1        变量2        变量3
时间                                         
2023-01-31  18.786064  10.326438  55.753224
2023-02-28  21.443209  11.937121  57.061620
2023-03-31  24.607846  11.292513  56.869731

3、滑动窗口

# 每3行求一个平均,窗口每次滑动一个位置
df.iloc[:5, 1:].rolling(window=3).mean()

# 输出:
                           变量1        变量2        变量3
时间                                                  
2023-01-01 00:00:00        NaN        NaN        NaN
2023-01-01 00:10:00        NaN        NaN        NaN
2023-01-01 00:20:00  15.186667  11.900000  61.716667
2023-01-01 00:30:00  15.183333  11.880000  61.840000
2023-01-01 00:40:00  15.163333  12.143333  61.976667

可以看到,前两行的值为空。这是因为它们前面的行数不满足要求(加上本身共3行),要解决这个问题,可以使用填充fillna,也可以设置最小窗口

# 最少一行数据,即只有一行时结果就是自身,两行时就求两行的均值
df.iloc[:5, 1:].rolling(window=3, min_periods=1).mean()

# 输出:

                           变量1        变量2        变量3
时间                                                  
2023-01-01 00:00:00  15.200000  12.140000  61.580000
2023-01-01 00:10:00  15.195000  12.065000  61.655000
2023-01-01 00:20:00  15.186667  11.900000  61.716667
2023-01-01 00:30:00  15.183333  11.880000  61.840000
2023-01-01 00:40:00  15.163333  12.143333  61.976667

4、将数据按固定时间长度分组

比如,将数据按月分组后传入自定义函数进行下一步处理。分组的函数是groupby,但现在缺少分组标签。一个方法是对同一个月的数据赋予同一个标签,可以使用自定义方法,也可以使用自带的方法

df.groupby(pd.Grouper(freq='M')).apply(my_func)

5、将时间按固定间隔输出

比如我现在有3个月数据,我希望输出包含年月的列表

df.index.to_period('M').unique().astype(str).to_list()

# 输出:
['2023-01', '2023-02', '2023-03']

文章来源:https://blog.csdn.net/qq_45055172/article/details/134976937
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。