Python中关于时间的处理方式
由于时间是不同于一般数字的另外一种格式,如何处理包含日期在内的时间问题,和各种之间格式之间的转换在面对财务时间数据分析时特别重要,Python提供了多种时间处理方式,这份笔记简单记录这些方法。
datetime库
datetime对象
datetime库中的datetime对象提供了绝大部分日期和时间相关的操作。
# 导入datetime库
import datetime as dt
# 获取当前时间
dt.datetime.now()
datetime.datetime(2021, 12, 20, 15, 40, 23, 156963)
# 另外一种获取当前时间的方式
dt.datetime.today()
datetime.datetime(2021, 12, 20, 15, 41, 43, 422976)
# 如果给定一个datetime对象,可以通过weekday()获取到这一天是星期几(结果从0开始到6分别表示星期一到星期日)
dt.datetime(2021,12,19).weekday()
6
从上面结果可以看到,时间的默认精确度到了微秒,有时候这个级别的精确度不重要,可以用replace函数将其去掉。
d = dt.datetime.now()
print(f"现在的时间是: {d}")
new_d = d.replace(microsecond=0)
print(f"现在的时间是: {new_d}")
现在的时间是: 2021-12-20 15:51:56.736694
现在的时间是: 2021-12-20 15:51:56
timedelta对象
时间间隔是用timedelta对象表示,这在计算两个时间点之间的时间长度比较重要,比如计算2021年1月1日到现在的时间可以通过下面的方式计算出来。
start = dt.datetime(2021,1,1,0,0)
delta_time = dt.datetime.now() - start
print(f'总共时间间隔: {delta_time}')
print(f'天数:{delta_time.days}')
print(f'秒数:{delta_time.seconds}')
print(f'微秒数:{delta_time.microseconds}')
print(f'总共秒数:{delta_time.total_seconds()}')
总共时间间隔: 353 days, 16:02:54.882767
天数:353
秒数:57774
微秒数:882767
总共秒数:30556974.882767
时间格式
# ISO标准时间格式
d.isoformat()
'2021-12-20T15:51:56.736694'
如果需要变化成其他格式表示,可以通过strftime()函数,详细的格式可以参考Python官方文档。
d.strftime("%A, %d. %B %Y %I:%M%p")
'Monday, 20. December 2021 03:51PM'
不同时区时间
除了now()可以用来获取当前所在位置时间外,使用utcnow()可以获取到UTC时区所对应的当前时间。
dt.datetime.utcnow()
datetime.datetime(2021, 12, 20, 15, 20, 42, 275498)
但是datetime只提供了显示当前UTC所对应的时间,如果需要知道其他时区当前时间可以通过新建tzinfo类的方式来获取,同时也可以通过导入pytz库的方式来获取。pytz的方式更加简单方便。
# 导入pytz库
import pytz
# 获取中国所在的时区
pytz.country_timezones['CN']
['Asia/Shanghai', 'Asia/Urumqi']
# 获取美国东部当前时间
d = dt.datetime.now()
d.astimezone(pytz.timezone("EST"))
datetime.datetime(2021, 12, 20, 10, 31, 41, 949550, tzinfo=<StaticTzInfo 'EST'>)
NumPy
NumPy也提供了一些处理时间的方法
import numpy as np
nd = np.datetime64('2021-12-20')
nd
numpy.datetime64('2021-12-20')
# 将datetime格式的时间转化为numpy格式
d = dt.datetime(2021,12,20,0,0)
np.datetime64(d)
numpy.datetime64('2021-12-20T00:00:00.000000')
# 将numpy时间格式转化为datetime格式可以使用astype函数
nd.astype(dt.datetime)
datetime.date(2021, 12, 20)
# 使用arange生成时间序列,时间间隔1小时
np.arange('2021-12-19T00:00:00','2021-12-20T12:00:00',dtype='datetime64[h]')
array(['2021-12-19T00', '2021-12-19T01', '2021-12-19T02', '2021-12-19T03',
'2021-12-19T04', '2021-12-19T05', '2021-12-19T06', '2021-12-19T07',
'2021-12-19T08', '2021-12-19T09', '2021-12-19T10', '2021-12-19T11',
'2021-12-19T12', '2021-12-19T13', '2021-12-19T14', '2021-12-19T15',
'2021-12-19T16', '2021-12-19T17', '2021-12-19T18', '2021-12-19T19',
'2021-12-19T20', '2021-12-19T21', '2021-12-19T22', '2021-12-19T23',
'2021-12-20T00', '2021-12-20T01', '2021-12-20T02', '2021-12-20T03',
'2021-12-20T04', '2021-12-20T05', '2021-12-20T06', '2021-12-20T07',
'2021-12-20T08', '2021-12-20T09', '2021-12-20T10', '2021-12-20T11'],
dtype='datetime64[h]')
pandas
pandas时间处理方法主要包含Timestamp和to_pydatetime函数。
import pandas as pd
ts = pd.Timestamp('2021-12-20')
ts
Timestamp('2021-12-20 00:00:00')
d = ts.to_pydatetime()
d
datetime.datetime(2021, 12, 20, 0, 0)
pd.to_datetime('2021-12-20', format='%Y-%m-%d')
Timestamp('2021-12-20 00:00:00')
# 使用date_range生成时间序列,时间间隔为1个月
pd.date_range('2021-1-1', freq='M', periods=12)
DatetimeIndex(['2021-01-31', '2021-02-28', '2021-03-31', '2021-04-30',
'2021-05-31', '2021-06-30', '2021-07-31', '2021-08-31',
'2021-09-30', '2021-10-31', '2021-11-30', '2021-12-31'],
dtype='datetime64[ns]', freq='M')
参考文献
-Yves Hilpisch, Python for Finance - Analyze Big Financial Data