Pandas时间序列、时间戳对象、类型转换、时间序列提取、筛选、重采样、窗口滑动
  utcwpaXdbjbR 2023年12月02日 16 0


时间序列数据是指在时间间隔不变的情况下收集的时间点数据,可以用来分析事物的长期发展趋势,并对未来进行预测。

date_range()方法及参数

pandas.date_range(start=None, end=None, periods=None, freq=None,
tz=None, normalize=False, name=None, inclusive=‘both’, *, unit=None,
**kwargs)

start:指定生成时间序列的开始时间。
end:指定生成时间序列的结束时间。
periods:指定生成时间序列的数量。

前三个参数,需要至少指定两个。

freq:指定生成时间序列的频率,默认为“D”(天),可以是Y年,M月,10D 10天,H时,5H 5个小时,T分钟,S秒等。
tz:返回本地化的DatetimeIndex的时区名称。
normalize:将开始、结束时间标准化为午夜,然后生成日期范围。
name:用来设置生成DatetimeIndex的名称。
inclusive:用来设置是否包含开始和结束时间,取值为left包含开始时间,不包含结束时间。取值为right则与left相反。默认为全闭区间。
unit:单位

返回类型是DatetimeIndex。

创建时间序列

import pandas  as pd
myt1 = pd.date_range(start='2022-10-28',end='2023-10-28')
display(myt1)


myt2 = pd.date_range(start='2022-10-28',periods=11,freq='M')
display(myt2)

myt3 = pd.date_range(start='2022-10-28 12:15:36',periods=11,freq='5T')
display(myt3)

Pandas时间序列、时间戳对象、类型转换、时间序列提取、筛选、重采样、窗口滑动_算法


以上三段代码:分别创建了频率为天、月、5分钟的时间序列。

时间戳对象

时间戳(Timestamp)类提供了丰富的时间处理接口,如日期加减、属性提取等。

import pandas  as pd
myt1 =pd.Timestamp('2023-10-28')
display(myt1)

myt2 =pd.Timestamp('01:06:32')
display(myt2)

Pandas时间序列、时间戳对象、类型转换、时间序列提取、筛选、重采样、窗口滑动_pandas_02


以上代码指定了日期的部分,分别创建了日期零点和当天时间的时间戳对象。

时间类型与字符串型的转换

在Pandas中,把字符串转化为时间类型使用to_datetime()方法,
把时间类型转换为字符串类型使用astype()方法。

import pandas as pd
myts1=pd.DataFrame({'A':[1,2,3,4,5,6],'B':['10:12:05','10:12:06','10:12:07','10:12:08','10:12:09','10:12:10']},
                   index=pd.date_range(start='10:12:05',periods=6,freq='S'))
print(myts1)


myts1.info()

# 字符串转日期
myts1.B=pd.to_datetime(myts1.B, format="%H:%M:%S")
display(myts1)

# 日期转字符串
print(myts1.index.time.astype(str))
# ['10:12:05' '10:12:06' '10:12:07' '10:12:08' '10:12:09' '10:12:10']
print(myts1.index.date.astype(str))
# ['2023-10-28' '2023-10-28' '2023-10-28' '2023-10-28' '2023-10-28' '2023-10-28']
import pandas  as pd
mytt1 =pd.Timestamp('2021-12-21 11:16:42')
display(mytt1)


print('显示的日期时间是:',mytt1.year,'年',mytt1.month,'月',mytt1.day, '日',mytt1.hour,'时',mytt1.minute,'分',mytt1.second,'秒')

print('一周中的第几天:',mytt1.dayofweek)
print('一年中的第几周:',mytt1.weekofyear)
print('一年中的第几季度:',mytt1.quarter)

if mytt1.is_leap_year :
    print('显示的日期是润年!')
else :
     print('显示的日期不是润年!')
if mytt1.is_month_start :
    print('显示的日期是月初第一天!')
else :
     print('显示的日期不是月初第一天!')
if mytt1.is_quarter_end :
    print('显示的日期是季度最后一天!')
else :
     print('显示的日期不是季度最后一天!')
if mytt1.is_year_start :
    print('显示的日期是年初第一天!')
else :
     print('显示的日期不是年初第一天!')

Pandas时间序列、时间戳对象、类型转换、时间序列提取、筛选、重采样、窗口滑动_时间序列_03

时间序列数据的筛选

import pandas as pd
import numpy as np
mys1 = pd.DataFrame(np.random.randint(10, 1000,size=(100,6)), 
                    columns=['A', 'B', 'C','D','E','F'],
                    index=pd.date_range('2023-12-20 10:15:16', periods= 100,freq='20T'))
print(mys1)


# 索引模糊匹配
mys1['2023-12-20 10':'2023-12-20 12']

# truncate过滤
mys1.truncate(before='2023-12-20 10:10:00',after='2023-12-20 11:50:00')

# between,需要先重置索引,增加索引列index
mys1=mys1.reset_index()
display(mys1)

mys1[mys1['index'].between('2023-12-20 10:15:30','2023-12-20 11:15:30')]

这里用到了三种方法来筛选日期:索引、truncate、between。

时间序列数据的重采样

时间序列的重采样是一种对原数据重新处理的方法,是对常规时间序列数据重新采样和频率转换的快捷方法。重采样分两种,分别是降采样和升采样。降采样是指高频数据到低频数据。升采样是指低频数据到高频数据。

import pandas as pd
import numpy as np
index =pd.date_range('2023-10-28 00:00:00', periods=10,freq='2T')
myse1 = pd.Series(range(10), index=index)
display(myse1)


# 降采样
myse1.resample('4T').sum()

# 满足条件的标签用右侧的right,如9:30~9:35,会选择9:35。
myse1.resample('4T',label='right').sum()

# 右侧闭区间
myse1.resample('4T',label='right',closed='right').sum()

# 使用asfreq()查看重采样后的结果
myse1.resample('1T').asfreq()

# 填充缺失值:向后填充缺失值
myse1.resample('1T').bfill()

# 填充缺失值:向前填充缺失值
myse1.resample('1T').ffill()

窗口滑动

实现时间序列数据的窗口滑动主要有三种方法,分别是shift()方法、diff()方法和rolling()方法。
shift()方法可以实现向前或向后取值。
diff()方法可以实现向前或向后取差值。
rolling()方法可以实现在一段滑动窗口内聚合取值。

import pandas as pd
import numpy as np
myse1 = pd.DataFrame(np.random.randint(100, 1000,size=(96,6)), 
                    columns=['A', 'B', 'C','D','E','F'],
                    index=pd.date_range('2023-10-28 10:00:00', periods=96,freq='5T'))
print(myse1)


myse1.head()

# 显示前5条
myse1.shift(1).head()

# 向后滑动5分钟取值
myse1.shift(1,freq='5T').head()

myse1.diff(1).head()

myse1.rolling(window=3).mean().head()

参考

date_rangetimeseries-offset-aliases


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月02日 0

暂无评论

推荐阅读
utcwpaXdbjbR