Pandas 19 - 日期时间

Pandas 19 - 日期时间


本文转载改编自

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


一、关于 Pandas 里面的时间

日期功能扩展了时间序列,在财务数据分析中起主要作用。在处理日期数据的同时,我们经常会遇到以下情况:

  • 生成日期序列
  • 将日期序列转换为不同的频率

偏移别名

大量的 字符串别名 被赋予常用的 时间序列频率。我们把这些别名称为偏移别名。

别名描述说明
B工作日频率
BQS商务季度开始频率
D日历/自然日频率
A年度(年)结束频率
W每周频率
BA商务年底结束
M月结束频率
BAS商务年度开始频率
SM半月结束频率
BH商务时间频率
SM半月结束频率
BH商务时间频率
BM商务月结束频率
H小时频率
MS月起始频率
T, min分钟的频率
SMSSMS半开始频率
S秒频率
BMS商务月开始频率
L, ms毫秒
Q季度结束频率
U, us微秒
BQ商务季度结束频率
N纳秒
BQ商务季度结束频率
QS季度开始频率

二、使用

Pandas为时间序列数据的工作时间提供了一个强大的工具,尤其是在金融领域。在处理时间序列数据时,我们经常遇到以下情况 -

  • 生成时间序列
  • 将时间序列转换为不同的频率

Pandas提供了一个相对紧凑和自包含的工具来执行上述任务。


1、获取当前时间

datetime.now()用于获取当前的日期和时间。

print(pd.datetime.now()) # 2020-01-27 20:42:47.207130

2、时间戳

  • 时间戳数据是时间序列数据的最基本类型,它将数值与时间点相关联。 对于Pandas对象来说,意味着使用时间点。

  • 也可以转换整数或浮动时期。这些的默认单位是纳秒(因为这些是如何存储时间戳的)。 然而,时代往往存储在另一个可以指定的单元中。


2.1 日期转时间戳
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

2.2 时间戳转日期

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)

3、创建一个时间范围


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')
'''


4、改变 频率



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')
'''

5、bdate_range() 工作日

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_rangebdate_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对象,如下所示 -


1、字符串

通过传递字符串,可以创建一个timedelta对象。参考以下示例代码 -

timediff = pd.Timedelta('2 days 2 hours 15 minutes 30 seconds')
print(timediff) # 2 days 02:15:30

2、整数

通过传递一个整数值与指定单位,这样的一个参数也可以用来创建Timedelta对象。

timediff = pd.Timedelta(6,unit='h')
print(timediff) # 0 days 06:00:00

3、数据偏移

例如 - 周,天,小时,分钟,秒,毫秒,微秒,纳秒的数据偏移也可用于构建。

timediff = pd.Timedelta(days=2)
print(timediff) # 2 days 00:00:00

4、运算操作

4.1 基本运算

可以在 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
'''

4.2 相加操作
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
'''

4.3 相减操作
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值