数据分析学习之时间序列(1)

时间序列

日常生活中我们的大多数诗句都是跟时间相关的,比如股票数据,每一个时间段的盈亏,因此,我了解了时间序列这个方便我们分析与时间相关的数据。

时间戳

import time
time.time()  # 查看当前的时间戳
# 输出
1584431953.366432

# 将时间戳转换成本地时间类型
t = time.time()
loc_t = time.localtime(t)
loc_t
# 可以看出 有年 月 日 小时 分钟 秒 星期几 一年中第几天
# 输出
time.struct_time(tm_year=2020, tm_mon=3, tm_mday=17, tm_hour=16, tm_min=0, tm_sec=9, tm_wday=1, tm_yday=77, tm_isdst=0)

# 将localtime 类型的时间转换成 格式化时间
str_f_time = time.strftime("%Y-%m-%d",loc_t)
str_f_time
# 输出
'2020-03-17'
字母 含义
%Y 以十进制数字表示的年份
%m 以十进制数字表示的月份[01,12]。.
%d 以十进制数字[01,31]表示的每月的一天.
%H 小时(24小时时钟)作为一个小数[00,23].
%M 十进制的分数[00,59].
%S 第二位是小数[00,61].
%z 与协调世界时的时区偏移.
%a 区域设置的缩写工作日名称.
%A 区域设置的缩写工作日名称.
%b 语言环境的缩写月份名称.
%B 本地的月份全名.
%c 区域设置的适当的日期和时间表示.
%I 小时(12小时钟)作为一个小数[01,12].
%p 相当于 AM 或 PM.

日期和时间数据类型的工具

import pandas as pd
import numpy as np
from datetime import datetime

# 查看当前时间
now = datetime.now()
now
# 年 月 日 时 分 
datetime.datetime(2020, 3, 17, 16, 5, 23, 917793)
# 取时间
# now 是一个对象 可以通过访问对象的方法取出时间
now.day,now.year
#输出
(17, 2020)

# 两个时间相减
d = datetime(2008,6,25) - datetime(2008,6,24,8,15)
d
# 相差的 第一个是天 第二个是秒
datetime.timedelta(0, 56700)

from datetime import timedelta
# 也可以用这个来计算时间的增减
start = datetime(2020,3,14)
# 在 start 的基础上 增加 一天 2400秒 也就是40分钟 默认如果不写 时分秒 从14号0点开始算
start + timedelta(1,2400)
# 输出
datetime.datetime(2020, 3, 15, 0, 40)

字符串和datetime的转换

#我们导入工具
from dateutil.parser import parse
v = '2020-03-16'
# 这里 时间格式要和v对应
datetime.strptime(v,"%Y-%m-%d")
# 就变成了datetime的数据类型
# 输出
datetime.datetime(2020, 3, 16, 0, 0)

# 我们能不能有一种方法批量的将字符串的时间数据类型转换成datetime时间数据类型呢?第一种方法可以利用 列表推导式

d = ['8/4/2020','10/1/2020']
[datetime.strptime(x,"%m/%d/%Y") for x in d]
# 输出
[datetime.datetime(2020, 8, 4, 0, 0), datetime.datetime(2020, 10, 1, 0, 0)]

# 第二钟方法

d = ['8/4/2020 12:00:00','10/1/2020 21:00:00']
pd.to_datetime(d)
# 这里转换成的也是datetime的时间数据类型
DatetimeIndex(['2020-08-04 12:00:00', '2020-10-01 21:00:00'], dtype='datetime64[ns]', freq=None)

带重复索引的时间序列

dates = pd.DatetimeIndex(['1/1/2000', '1/2/2000', '1/2/2000','1/2/2000', '1/3/2000'])
dates
#输出
DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-02', '2000-01-02',
               '2000-01-03'],
              dtype='datetime64[ns]', freq=None)
ts2 = pd.Series(np.arange(5),index=dates)
ts2
#输出
2000-01-01    0
2000-01-02    1
2000-01-02    2
2000-01-02    3
2000-01-03    4
dtype: int32
# 索引 支持 位置索引 标签索引
ts2['1/3/2000']
ts2[4]
ts['2000-1-2']
# 会选出所有1月2号的值
2000-01-02    1
2000-01-02    2
2000-01-02    3
dtype: int32

# 我们对时间序列进行分组 这里演示的对象是series对象
# series 只有一列 所以们只能按照 层级来分组
ts2.groupby(level=0).mean()
2000-01-01    0
2000-01-02    2
2000-01-03    4
dtype: int32

日期的范围,频率以及移动

生成日期范围

index = pd.date_range('2013-02-01','2013-03-01')
index 
# 生成索引datetimeindex的索引 从2 1 到 3 1 
DatetimeIndex(['2013-02-01', '2013-02-02', '2013-02-03', '2013-02-04',
               '2013-02-05', '2013-02-06', '2013-02-07', '2013-02-08',
               '2013-02-09', '2013-02-10', '2013-02-11', '2013-02-12',
               '2013-02-13', '2013-02-14', '2013-02-15', '2013-02-16',
               '2013-02-17', '2013-02-18', '2013-02-19', '2013-02-20',
               '2013-02-21', '2013-02-22', '2013-02-23', '2013-02-24',
               '2013-02-25', '2013-02-26', '2013-02-27', '2013-02-28',
               '2013-03-01'],
              dtype='datetime64[ns]', freq='D')


pd.date_range('2012-04-01',periods=20)  # 指定生成多少天
# 输出
DatetimeIndex(['2012-04-01', '2012-04-02', '2012-04-03', '2012-04-04',
               '2012-04-05', '2012-04-06', '2012-04-07', '2012-04-08',
               '2012-04-09', '2012-04-10', '2012-04-11', '2012-04-12',
               '2012-04-13', '2012-04-14', '2012-04-15', '2012-04-16',
               '2012-04-17', '2012-04-18', '2012-04-19', '2012-04-20'],
              dtype='datetime64[ns]', freq='D')

pd.date_range(end='2012-04-01',periods=20) # 指定截至时间 可以从截至时间往前生成时间序列
# 输出
DatetimeIndex(['2012-03-13', '2012-03-14', '2012-03-15', '2012-03-16',
               '2012-03-17', '2012-03-18', '2012-03-19', '2012-03-20',
               '2012-03-21', '2012-03-22', '2012-03-23', '2012-03-24',
               '2012-03-25', '2012-03-26', '2012-03-27', '2012-03-28',
               '2012-03-29', '2012-03-30', '2012-03-31', '2012-04-01'],
              dtype='datetime64[ns]', freq='D')

pd.date_range('2020-01-01','2020-12-01',freq='MS')  # ms 生成的时间序列是从一号开始
# 输出
DatetimeIndex(['2020-01-01', '2020-02-01', '2020-03-01', '2020-04-01',
               '2020-05-01', '2020-06-01', '2020-07-01', '2020-08-01',
               '2020-09-01', '2020-10-01', '2020-11-01', '2020-12-01'],
              dtype='datetime64[ns]', freq='MS')

更多freq参数详见与https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-offset-aliases

移动数据

ts = pd.Series(np.random.randn(4),
                index=pd.date_range('1/1/2000', periods=4, freq='M'))
ts
2000-01-31    1.075073
2000-02-29   -1.001103
2000-03-31    3.097602
2000-04-30    1.184195
Freq: M, dtype: float64

ts.shift(2)  # 把数据往下移动  上面的数据没有了 就用nan填充
# 输出
2000-01-31         NaN
2000-02-29         NaN
2000-03-31    1.075073
2000-04-30   -1.001103
Freq: M, dtype: float64

ts.shift(-2)  # 把数据往上移动
# 输出
2000-01-31    3.097602
2000-02-29    1.184195
2000-03-31         NaN
2000-04-30         NaN
Freq: M, dtype: float64

ts.shift(2,freq='M')  #  这是每一种数据的时间 都增加两个月 并不会移动数据 只是对应关系改变了

2000-03-31    1.075073
2000-04-30   -1.001103
2000-05-31    3.097602
2000-06-30    1.184195
Freq: M, dtype: float64
发布了21 篇原创文章 · 获赞 12 · 访问量 431

猜你喜欢

转载自blog.csdn.net/weixin_44984627/article/details/104925969