文章数据
收藏(次)
【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级索引。
--------------------------------------------------------------------------------
分享
收藏
点赞人
举报
文章标签
评论列表