赞
踩
本文转载改编自
https://www.yiibai.com/pandas/python_pandas_concatenation.html 时间序列部分
https://www.yiibai.com/pandas/python_pandas_date_functionality.html
https://www.yiibai.com/pandas/python_pandas_timedelta.html
日期功能扩展了时间序列,在财务数据分析中起主要作用。在处理日期数据的同时,我们经常会遇到以下情况:
大量的 字符串别名 被赋予常用的 时间序列频率。我们把这些别名称为偏移别名。
别名 | 描述说明 |
---|---|
B | 工作日频率 |
BQS | 商务季度开始频率 |
D | 日历/自然日频率 |
A | 年度(年)结束频率 |
W | 每周频率 |
BA | 商务年底结束 |
M | 月结束频率 |
BAS | 商务年度开始频率 |
SM | 半月结束频率 |
BH | 商务时间频率 |
SM | 半月结束频率 |
BH | 商务时间频率 |
BM | 商务月结束频率 |
H | 小时频率 |
MS | 月起始频率 |
T, min | 分钟的频率 |
SMS | SMS半开始频率 |
S | 秒频率 |
BMS | 商务月开始频率 |
L, ms | 毫秒 |
Q | 季度结束频率 |
U, us | 微秒 |
BQ | 商务季度结束频率 |
N | 纳秒 |
BQ | 商务季度结束频率 |
QS | 季度开始频率 |
Pandas为时间序列数据的工作时间提供了一个强大的工具,尤其是在金融领域。在处理时间序列数据时,我们经常遇到以下情况 -
Pandas提供了一个相对紧凑和自包含的工具来执行上述任务。
datetime.now()
用于获取当前的日期和时间。
print(pd.datetime.now()) # 2020-01-27 20:42:47.207130
时间戳数据是时间序列数据的最基本类型,它将数值与时间点相关联。 对于Pandas对象来说,意味着使用时间点。
也可以转换整数或浮动时期。这些的默认单位是纳秒(因为这些是如何存储时间戳的)。 然而,时代往往存储在另一个可以指定的单元中。
print('\n-------------21')
time = pd.Timestamp('2018-11-01')
print(time) # 2018-11-01 00:00:00
time = pd.Timestamp('2020-02-01 12:23:12')
print(time) # 2020-02-01 12:23:12
time = pd.Timestamp(1588686880,unit='s')
print(time) # 2020-05-05 13:54:40
time = pd.to_datetime(pd.Series(['Jul 31, 2009','2019-10-10', None]))
print(time)
time = pd.to_datetime(['2009/11/23', '2019.12.31', None])
print(time)
time = pd.date_range("12:00", "23:59", freq="30min").time print(time) ''' [datetime.time(12, 0) datetime.time(12, 30) datetime.time(13, 0) datetime.time(13, 30) datetime.time(14, 0) datetime.time(14, 30) datetime.time(15, 0) datetime.time(15, 30) datetime.time(16, 0) datetime.time(16, 30) datetime.time(17, 0) datetime.time(17, 30) datetime.time(18, 0) datetime.time(18, 30) datetime.time(19, 0) datetime.time(19, 30) datetime.time(20, 0) datetime.time(20, 30) datetime.time(21, 0) datetime.time(21, 30) datetime.time(22, 0) datetime.time(22, 30) datetime.time(23, 0) datetime.time(23, 30)] ''' datelist = pd.date_range('2020/11/21', periods=5) # 日期范围 print(datelist) ''' DatetimeIndex(['2020-11-21', '2020-11-22', '2020-11-23', '2020-11-24', '2020-11-25'], dtype='datetime64[ns]', freq='D') '''
time = pd.date_range("12:00", "23:59", freq="H").time print(time) ''' [datetime.time(12, 0) datetime.time(13, 0) datetime.time(14, 0) datetime.time(15, 0) datetime.time(16, 0) datetime.time(17, 0) datetime.time(18, 0) datetime.time(19, 0) datetime.time(20, 0) datetime.time(21, 0) datetime.time(22, 0) datetime.time(23, 0)] ''' datelist = pd.date_range('2020/11/21', periods=5,freq='M') print(datelist) ''' DatetimeIndex(['2020-11-30', '2020-12-31', '2021-01-31', '2021-02-28', '2021-03-31'], dtype='datetime64[ns]', freq='M') '''
bdate_range()
用来表示商业日期范围,不同于date_range()
,它不包括星期六和星期天。
datelist = pd.date_range('2020/01/24', periods=5) bdatelist = pd.bdate_range('2020/01/24', periods=5) print(datelist) ''' DatetimeIndex(['2020-01-24', '2020-01-25', '2020-01-26', '2020-01-27', '2020-01-28'], dtype='datetime64[ns]', freq='D') ''' print(bdatelist) # 不包含 1-25,1-26,因为这两天是工作日。 ''' DatetimeIndex(['2020-01-24', '2020-01-27', '2020-01-28', '2020-01-29', '2020-01-30'], dtype='datetime64[ns]', freq='B') '''
像date_range
和bdate_range
这样的便利函数利用了各种频率别名。
date_range
的默认频率是日历中的 自然日
,而bdate_range
的默认频率是工作日
。
start = pd.datetime(2020, 2, 1)
end = pd.datetime(2017, 2, 7)
dates = pd.date_range(start, end)
bdates = pd.bdate_range(start, end)
print(dates)
# DatetimeIndex([], dtype='datetime64[ns]', freq='D')
print(bdates)
# DatetimeIndex([], dtype='datetime64[ns]', freq='B')
时间差(Timedelta)是时间上的差异,以不同的单位来表示。
例如:日,小时,分钟,秒。它们可以是正值,也可以是负值。
可以使用各种参数创建Timedelta
对象,如下所示 -
通过传递字符串,可以创建一个timedelta
对象。参考以下示例代码 -
timediff = pd.Timedelta('2 days 2 hours 15 minutes 30 seconds')
print(timediff) # 2 days 02:15:30
通过传递一个整数值与指定单位,这样的一个参数也可以用来创建Timedelta
对象。
timediff = pd.Timedelta(6,unit='h')
print(timediff) # 0 days 06:00:00
例如 - 周,天,小时,分钟,秒,毫秒,微秒,纳秒的数据偏移也可用于构建。
timediff = pd.Timedelta(days=2)
print(timediff) # 2 days 00:00:00
可以在 Series/DataFrames 上执行运算操作,并通过在datetime64 [ns]
系列或在时间戳上 减法操作 来构造timedelta64 [ns]
系列。
s = pd.Series(pd.date_range('2020-2-1', periods=3, freq='D')) td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ]) df = pd.DataFrame(dict(A = s, B = td)) print(df) ''' A B 0 2020-02-01 0 days 1 2020-02-02 1 days 2 2020-02-03 2 days ''' s = pd.Series(pd.date_range('2020-2-1', periods=3, freq='M')) td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ]) df = pd.DataFrame(dict(A = s, B = td)) print(df) ''' A B 0 2020-02-29 0 days 1 2020-03-31 1 days 2 2020-04-30 2 days '''
s = pd.Series(pd.date_range('2018-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))
df['C']=df['A']+df['B']
print(df)
'''
A B C
0 2018-01-01 0 days 2018-01-01
1 2018-01-02 1 days 2018-01-03
2 2018-01-03 2 days 2018-01-05
'''
s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))
td = pd.Series([ pd.Timedelta(days=i) for i in range(3) ])
df = pd.DataFrame(dict(A = s, B = td))
df['C']=df['A']+df['B']
df['D']=df['C']-df['B']
print(df)
'''
A B C D
0 2012-01-01 0 days 2012-01-01 2012-01-01
1 2012-01-02 1 days 2012-01-03 2012-01-02
2 2012-01-03 2 days 2012-01-05 2012-01-03
'''
2020-01-28
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。