文章数据
收藏(次)

【python数据分析】第十一章 时间序列

加关注
from datetime import datetime
from datetime import timedelta
这个包不是 pandas 的, 可能是 py 自带的???

from dateutil.parser import parse
import pandas as pd
import numpy as np
--------------------------------------------------------------------------------
now = datetime.now()
now.year, now.month, now.day 输出:
(2020, 10, 18)
--------------------------------------------------------------------------------
delta = now - datetime(2020, 10, 17) # 2020-10-17 00:00:00
delta 输出:
datetime.timedelta(days=1, seconds=74894, microseconds=386475) # 相差1天,74894秒...
delta.total_seconds() # 两个时间相差的秒数总数
--------------------------------------------------------------------------------
now + timedelta(days=1, hours=1) # 当前时间 加上一个间隔时间
--------------------------------------------------------------------------------
两个方法的定义
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])
--------------------------------------------------------------------------------
字符串和datetime的相互转换
--------------------------------------------------------------------------------
str(datetime.now()) # 输出: '2020-10-18 21:09:14.707377'
--------------------------------------------------------------------------------
datetime.now().strftime('%Y-%m-%d') # '2020-10-18'
--------------------------------------------------------------------------------
strftime 的格式:
%y 两个数字表示的年份 15
%Y 四个数字表示的年份 2015
%m 返回月份 范围[01,12]
%d 返回的是当前时间是当前月的第几天[01,31]

%H 以24小时制表示当前小时 [00,23]
%I 以12小时制表示当前小时 [01, 12]
%M 返回分钟数 范围 [00,59]
%U 返回当周是当年的第几周 以周日为第一天 [00,53], 每年第一个周日前的几天是第0周
%W 返回当周是当年的第几周 以周一为第一天, 每年第一个周一前的几天是第0周
%z 与utc时间的间隔 (如果是本地时间,返回空字符串)
%F %Y-%m-%d 简写形式 2012-4-18
%D %m/%d/%y 简写形式 04/18/12

格式续表
%a 星期几简写
%A 星期几全写
%b 月份简写
%B 月份全写
%c 完整的日期和时间
%p 不同环境的AM pM
%x 适合当前环境的日期格式 May 1,2012 会产生 05/01/2012 (美国)
%X 适合当前环境的时间格式 04:24:12 PM
--------------------------------------------------------------------------------
value = '2020-10-18'
datetime.strptime(value, '%Y-%m-%d') # 输出:datetime.datetime(2020, 10, 18, 0, 0)
--------------------------------------------------------------------------------
datestrs = ['7/6/2011', '8/6/2011']
[datetime.strptime(x, '%m/%d/%Y') for x in datestrs]
输出:
[datetime.datetime(2011, 7, 6, 0, 0), datetime.datetime(2011, 8, 6, 0, 0)]
--------------------------------------------------------------------------------
from dateutil.parser import parse
parse('2018-10-18') # 输出 datetime.datetime(2018, 10, 18, 0, 0)
--------------------------------------------------------------------------------
parse('Jan 31, 1997 10:45 PM') # 输出 datetime.datetime(1997, 1, 31, 22, 45)
--------------------------------------------------------------------------------
parse('6/12/2011', dayfirst=False) # datetime.datetime(2011, 6, 12, 0, 0)
parse('6/12/2011', dayfirst=True) # datetime.datetime(2011, 12, 6, 0, 0)
--------------------------------------------------------------------------------
datestrs = ['2011-07-06 12:00:00', '2011-08-06 00:00:00']
pd.to_datetime(datestrs)
输出如下:
DatetimeIndex(['2011-07-06 12:00:00', '2011-08-06 00:00:00'], dtype='datetime64[ns]', freq=None)
--------------------------------------------------------------------------------
pd.to_datetime(datestrs + [None]) # 对空值的处理:输出字符串 NaT
输出如下:
DatetimeIndex(['2011-07-06 12:00:00', '2011-08-06 00:00:00', 'NaT'], dtype='datetime64[ns]', freq=None)
--------------------------------------------------------------------------------
dtidx =pd.to_datetime(datestrs + [None])
pd.isnull(dtidx) # 输出: array([False, False, True])
--------------------------------------------------------------------------------
NaT(Not a Time)是pandas中时间戳数据的null值。
--------------------------------------------------------------------------------
注意:dateutil.parser是一个实用但不完美的工具。比如说,它会把一些原本不
是日期的字符串认作是日期(比如"42"会被解析为2042年的今天)
================================================================================
时间序列基础
--------------------------------------------------------------------------------
dates = [datetime(2011, 1, 2), datetime(2011, 1, 5),
datetime(2011, 1, 7), datetime(2011, 1, 8),
datetime(2011, 1, 10), datetime(2011, 1, 12)]

ts = pd.Series(np.random.randn(6), index=dates)
type(ts.index[0]) # 输出: pandas._libs.tslibs.timestamps.Timestamp
ts.index[0] # 输出: Timestamp('2011-01-02 00:00:00')
--------------------------------------------------------------------------------
ts 输出:
2011-01-02 0.913722
2011-01-05 -0.621228
2011-01-07 1.235893
2011-01-08 0.834137
2011-01-10 -1.414272
2011-01-12 0.041147
dtype: float64

索引数据:
ts[ts.index[2]] # 输出: 1.235892842802161
ts['2011-1-10'] # 这样也行 -1.414271649157062
--------------------------------------------------------------------------------
这些都可以
ts['01/10/2011']
ts['2011/01/10']
ts['20110110']
ts['2011-1-10']
--------------------------------------------------------------------------------
pd.date_range(
start=None,
end=None,
periods=None, # 生成多少个时间
freq=None,
tz=None,
normalize=False,
name=None,
closed=None,
**kwargs,
) -> pandas.core.indexes.datetimes.DatetimeIndex
--------------------------------------------------------------------------------
longer_ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
longer_ts 里面index 是1000个时间,

索引给出一个时间范围时间,就能检索这一段时间的数据,厉害啊,像分组一样
longer_ts['2002']

longer_ts['2002-05']
longer_ts['2002-05-11']
# longer_ts['11'] # ERROR 这样就有歧义了,错误
--------------------------------------------------------------------------------
时间进行切片:切片 跟之前一样,可以传入字符串日期、datetime或Timestamp
longer_ts[datetime(2001,1,9) : datetime(2001,1,15)]
--------------------------------------------------------------------------------
longer_ts['2001-1-10' : '2001/2/1']
--------------------------------------------------------------------------------
longer_ts.truncate(before='2000/1/5') # 删除数据 返回剩余的数据,原数据没有变化
--------------------------------------------------------------------------------
# 生成一个时间列表, 开始时间是 2000-1-1,生成100个,频率是 W-WED, 每周周三
# 由于 2000/1/1不是周三,所以 2000-01-05 是周三,周三的这个才是生成的第一个数据
dates = pd.date_range('1/1/2000', periods=100, freq='W-WED')
--------------------------------------------------------------------------------
long_df = pd.DataFrame(np.random.randn(100, 4),
index=dates,
columns=['Colorado', 'Texas','New York', 'Ohio'])

long_df.loc['5-2001'] # 检索时间在这个时间段的行数据
--------------------------------------------------------------------------------
重复的时间序列:
dates = pd.DatetimeIndex(['1/1/2000', '1/2/2000', '1/2/2000','1/2/2000', '1/3/2000'])
dup_ts = pd.Series(np.arange(5), index=dates)
dup_ts.index.is_unique # 输出标量, False 表示当前有重复的 索引

dup_ts['1/2/2000'] # 这个是重复索引,返回三条数据

# 使用 groupby能够重复索引进行分组
dup_ts.groupby(level=0).count() # 分组依据不好写,使用 level=0 表示使用 0级索引。
--------------------------------------------------------------------------------



>> 目录 << 


 

分享
收藏
点赞人
举报
文章标签
评论列表

推荐

暂无推荐