作者:湛林
来源:凹凸数据
# pd.to_datetime 可以解析多种格式的日期形式
pd.to_datetime(['1/1/2018', np.datetime64('2018-01-01'),
datetime.datetime(2018, 1, 1)])
# 生成固定频率的日期
pd.date_range('2018-01-01', periods=3, freq='H')
# 设置时间的时区
dti = dti.tz_localize('UTC')
# 调整时间的时区
dti.tz_convert('US/Pacific')
a = pd.Timestamp('2018-01-05')
# 输出a 是周几
a.day_name()
# 加一天
b = a + pd.Timedelta('1 day')
b.day_name()
# 加一个工作日
c = a + pd.offsets.BDay()
c.day_name()
pandas中一共有四种日期类型,分别是
对于时间序列数据,传统的做法是在一个序列或DataFrame的索引中表示时间成分,这样就可以对时间元素执行操作。pandas也可以将时间作为数据
时间戳数据是时间序列数据的最基本类型,它将值与时间点关联起来。对于panda对象,它意味着使用时间点。
时间跨度是指一个时期,period。周期表示的跨度可以明确指定,也可以从字符串中推断得到。
上述二者都可以成为index,而且如果是列表,则会自动被识别为index
# 传进Series,返回的也是Series
pd.to_datetime(pd.Series(['Jul 31, 2009', '2010-01-10', None]))
# 传进列表,返回的是一个DatetimeIndex
pd.to_datetime(['2005/11/23', '2010.12.31'])
# 传入dayfirst=True,设置解析日期时的格式是日-月-年,否则就是月-日-年
pd.to_datetime(['12-01-2012', '01-12-2012'], dayfirst=False)
# infer参数可以用于让计算机自己推测 时间间隔
pd.DatetimeIndex(['2018-01-01', '2018-01-03', '2018-01-05'], freq='infer')
# 通过format设置特定的解析模式
pd.to_datetime('2010/11/12', format='%Y/%m/%d')
df = pd.DataFrame({'year': [2015, 2016], 'month': [2, 3],'day': [4, 5], 'hour': [2, 3]})
# 用数据框的而不同列拼凑成一个日期数据
pd.to_datetime(df)
# 选特定的要素组成日期数据,必选的是年月日,可选的是时分秒等
pd.to_datetime(df[['year', 'month', 'day']])
# 有无法解析的直接全部报错
pd.to_datetime(['2009/07/31', 'asd'], errors='raise')
# 无法解析的忽略,原封不动返回
pd.to_datetime(['2009/07/31', 'asd'], errors='ignore')
# 无法解析的返回 空值
pd.to_datetime(['2009/07/31', 'asd'], errors='coerce')
从元年开始,至今的秒数,可以转换为正常 年月日 的日期
pd.to_datetime([1349720105, 1349806505], unit='s')
# 正常时间-某特定时间,转化成从特定时间至今的秒数(整数)
(stamps - pd.Timestamp("1970-01-01")) // pd.Timedelta('1s')
# 从1960-01-01起,分别加1,2,3。单位为Day
pd.to_datetime([1, 2, 3], unit='D', origin=pd.Timestamp('1960-01-01'))
# 两种方法均可以生成时间戳index
pd.DatetimeIndex(dates)
pd.Index(dates)
start = datetime.datetime(2011, 1, 1)
end = datetime.datetime(2012, 1, 1)
# date_range是自然日
pd.date_range(start, end)
# bdate_range是工作日
pd.bdate_range(start, end)
# 还可以传入开始,period,频率参数生成
pd.date_range(start, periods=1000, freq='M')
pd.bdate_range(start, periods=250, freq='BQS')
# 传入首尾,频率
pd.date_range(start, end, freq='BM')
pd.date_range(start, end, freq='W')
# 传入开始 或结尾,period参数
pd.bdate_range(end=end, periods=20) # 结束往前推20个周期
pd.bdate_range(start=start, periods=20) # 开始往后推20个周期
# 指定开始、结束和周期,将生成一个从开始到结束均匀间隔的日期范围
pd.date_range('2018-01-01', '2018-01-05', periods=5)
pd.date_range('2018-01-01', '2018-01-05', periods=10)
weekmask = 'Mon Wed Fri' # 只能是 ‘Mon Tue Wed Thu Fri’ 多选
holidays = [datetime.datetime(2011, 1, 5), datetime.datetime(2011, 3, 14)]
# 设置holidays 和 mask,剔除holidays的日期,直选mask设定的周X,默认全部工作日
pd.bdate_range(start, end, freq='C', weekmask=weekmask, holidays=holidays)
# 日期或字符串解析数据可以作为索引
ts[datetime.datetime(2011, 12, 25):] # 选2011.12.25后的日期数据
ts['10/31/2011':'12/31/2011'] # 切片选择数据
ts['2011'] # 按年份选择数据
ts['2011-6'] # 按年-月选择数据
# 数据框同样可以使用切片数据
# 选到日的时候,右侧是闭的,选
dft['2013-1':'2013-2'] # 最后一条2013/02的数据也会选入
dft['2013-1':'2013-2-28'] # 2013.2.28的全部数据会被选入
dft['2013-1':'2013-2-28 00:00:00'] # 有精确时间的,最后00:00:00被选入。