作者:陈卓然 (北京大学)
邮箱:chenzhr25@mail2.sysu.edu.cn
在经济学的研究当中,特别是有关金融学的研究中,时间是一个非常重要的变量。在很多情况下,由于日期和时间的形式多种多样,处理起来难免会遇到各种各样的问题。为此,本推文将介绍 Python 中处理时间和日期变量的几种方式。本推文主要介绍在如下三种环境下处理时间日期数据的方式:
温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:
1. Python
Python 中的 datetime
标准库可以为我们做绝大多数有关日期和时间相关的操作:
from pylab import mpl, plt
plt.style.use('seaborn')
mpl.rcParams['font.family'] = 'serif'
%matplotlib inline
import datatime as dt
dt.datetime.today()
dt.datetime.today().weekday()
我们也可以自由创建一个 datetime
的类,例如:
d = dt.datetime(2020, 10, 31, 10, 5, 30, 500000)
str(d)
'2020-10-31 10:05:30.500000'
我们可以提取这个类的年,月,日,小时等。
d.year, d.month, d.hour, d.second
(2020, 10, 10, 30)
我们可以将 datetime
转成序数:
o = d.toordinal()
或者反过来:
dt.datetime.fromordinal(o)
我们可以将 datetime
分割出 date
和 time
:
t = dt.datetime.time(d)
t
datetime.time(10, 5, 30, 500000)
dd = dt.datetime.date(d)
dd
datetime.date(2020, 10, 31)
我们也可以计算两个时间点之间的跨度:
td = d - dt.datetime.now()
td
datetime.timedelta(days=-1002, seconds=84289, microseconds=752299)
当然我们也可以转换日期时间的表示方式,比如:
d.strftime('%A, %d. %B %Y %I:%M%p')
'Saturday, 31. October 2020 10:05AM'
下表列出了年,月,日,周,小时,分钟等的代码,数据来源是 Python Datetime。
Directive | Description | Example |
---|
%a | Weekday, short version | Wed |
%A | Weekday, full version |
Wednesday |
%w | Weekday as a number 0-6, 0 is Sunday | 3 |
%d | Day of month 01-31 | 31 |
%b | Month name, short version | Dec |
%B | Month name, full version | December |
%m | Month as a number 01-12 | 12 |
%y | Year, short version, without century | 18 |
%Y | Year, full version | 2018 |
%H | Hour 00-23 | 17 |
%I | Hour 00-12 | 05 |
%p | AM/PM | PM |
%M | Minute 00-59 | 41 |
%S | Second 00-59 | 08 |
%f | Microsecond 000000-999999 | 548513 |
%z | UTC offset | +0100 |
%Z | Timezone | CST |
%j | Day number of year 001-366 | 365 |
%U | Week number of year, Sunday as the first day of week, 00-53 | 52 |
%W | Week number of year, Monday as the first day of week, 00-53 | 52 |
%c |
Local version of date and time | Mon Dec 31 17:41:00 2018 |
%C | Century | 20 |
%x | Local version of date | 12/31/18 |
%X | Local version of time | 17:41:00 |
%% | A % character | % |
%G | ISO 8601 year | 2018 |
%u | ISO 8601 weekday (1-7) | 1 |
%V | ISO 8601 weeknumber (01-53) | 01 |
另外一个好用的函数是 strptime
这个命令可以将任意形式的日期时间字符串转换成datetime格式的字符串。
dt.datetime.strptime('2017-03-31', '%Y-%m-%d')
datetime.datetime(2017, 3, 31, 0, 0)
2. Numpy
Numpy 中也提供了若干处理日期时间数据的函数:
# Construction from str object and string representation
nd = np.datetime64('2020-10-31')
nd
numpy.datetime64('2020-10-31')
np.datetime_as_string(nd)
'2020-10-31'
在 Numpy 中另外一种创建 datetime 型对象的方式是通过提供一个字符串和频率信息。
nd = np.datetime64('2020-10', 'M')
nd = np.datetime64('2020-10', 'D')
numpy.datetime64('2020-10')
numpy.datetime64('2020')
np.array(['2020-06-10', '2020-07-10', '2020-08-10'], dtype='datetime64')
array(['2020-06-10', '2020-07-10', '2020-08-10'], dtype='datetime64[D]')
我们也可以采用 np.arange
的方法来生成一系列时间:
np.arange("2020-10-31",'2020-12-15', dtype = 'datetime64')
array(['2020-10-31', '2020-11-01', '2020-11-02', '2020-11-03',
'2020-11-04', '2020-11-05', '2020-11-06', '2020-11-07',
'2020-11-08', '2020-11-09', '2020-11-10', '2020-11-11',
'2020-11-12', '2020-11-13', '2020-11-14', '2020-11-15',
'2020-11-16', '2020-11-17', '2020-11-18', '2020-11-19',
'2020-11-20', '2020-11-21', '2020-11-22', '2020-11-23',
'2020-11-24', '2020-11-25', '2020-11-26', '2020-11-27',
'2020-11-28', '2020-11-29', '2020-11-30', '2020-12-01',
'2020-12-02', '2020-12-03', '2020-12-04', '2020-12-05',
'2020-12-06', '2020-12-07', '2020-12-08', '2020-12-09',
'2020-12-10', '2020-12-11', '2020-12-12', '2020-12-13',
'2020-12-14'], dtype='datetime64[D]')
np.arange("2020-10-31",'2020-12-15', dtype = 'datetime64[W]')
array(['2020-10-29', '2020-11-05', '2020-11-12', '2020-11-19',
'2020-11-26', '2020-12-03'], dtype='datetime64[W]'
时间序列数据的绘制有时可能会很困难,matplotlib
默认是支持标准的 datetime
对象,因此我们需要现将 numpy
中的 numpy datetime64
转换成 Python 的 datetime
。
dtl = np.arange('2020-01-01T00:00:00', '2020-01-02T00:00:00',dtype='datetime64[h]')
rnd = np.random.standard_normal(len(dtl)).cumsum()**3
fig = plt.figure(figsize=(10,6))
plt.plot(dtl.astype(dt.datetime), rnd,'cornflowerblue')
fig.autofmt_xdate()

3. Pandas
Pandas 中有着一些非常方便的处理日期和时间数据的类。首先,Pandas 中提供了 Timestamp
的类,这个类作为 datetime
和 datetime64
的替代。
ts = pd.Timestamp('2020-10-06')
ts
Timestamp('2020-10-06 00:00:00')
# datetime object from Timestamp object
ts.to_pydatetime()
datetime.datetime(2020, 10, 6, 0, 0)
另外一个非常有用的类是 DatetimeIndex
,这是一个创建时间 indices 的一个非常灵活而强大的工具,它可以通过 pd.date_range()
函数来生成。
dti = pd.date_range('2020/01/01', freq='M', periods=12)
DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30',
'2020-05-31', '2020-06-30', '2020-07-31', '2020-08-31',
'2020-09-30', '2020-10-31', '2020-11-30', '2020-12-31'],
dtype='datetime64[ns]', freq='M')
在 Pandas 中对于含有日期时间序列的数据的绘图是非常容易的。
rnd = np.random.standard_exponential(len(dti))
df2 = pd.DataFrame(rnd, columns=['data'], index=dti)
df2.plot(figsize = (10,6))

4. 小结
本文简要介绍了 Python 内置,Numpy 以及 Pandas 中处理日期时间序列数据的函数,不难看出 Python 在处理这类数据时的强大之处。
5. 相关推文
Note:产生如下推文列表的 Stata 命令为:
lianxh python
安装最新版 lianxh
命令:
ssc install lianxh, replace
- 初虹, 2022, Python爬虫1:小白系列之requests和json, 连享会 No.887.
- 初虹, 2022, Python爬虫2:小白系列之requests和lxml, 连享会 No.888.
- 周豪波, 2020, Python 调用 API 爬取百度 POI 数据小贴士——坐标转换、数据清洗与 ArcGIS 可视化, 连享会 No.20.
- 周豪波, 2020, Python 调用 API 进行逆地理编码, 连享会 No.59.
- 孔亦泽, 2023, 分享:公开数据库 及 数据格式转换-R-Stata-Python, 连享会 No.1272.
- 孙斯嘉, 2020, Python 调用 API 爬取百度 POI 数据, 连享会 No.60.
- 孙斯嘉, 2020, Python 调用 API 进行地理编码, 连享会 No.62.
- 左从江, 2020, Python: 批量爬取下载中国知网(CNKI) PDF论文, 连享会 No.54.
- 张春雷, 2022, Stata+Python:导入超大Excel文档的新思路-以国泰安为例, 连享会 No.1021.
- 张洪洋, 2023, Python:文本数据增强, 连享会 No.1240.
- 张翠燕, 2020, Python+Wind:用 Pyautogui 轻松下载 Wind 数据, 连享会 No.257.
- 杨晓军, 2022, Stata-Python交互-10:Stata17 新特性之PyStata的配置与应用, 连享会 No.996.
- 梁淑珍, 2022, Python:Jaccard 相似度和距离, 连享会 No.1043.
- 梁淑珍, 2022, Python:文本分析必备—搜狗词库, 连享会 No.1078.
- 王颖, 2022, Python:爬取动态网站, 连享会 No.932.
- 秦利宾, 2020, Python:爬取上市公司公告-Wind-CSMAR, 连享会 No.131.
- 秦利宾, 2021, Python:爬取巨潮网公告, 连享会 No.646.
- 范思妤, 2023, Python:基于selenium爬取科创板审核问询, 连享会 No.1172.
- 许梦洁, 2020, Python: 6 小时爬完上交所和深交所的年报问询函, 连享会 No.104.
- 许梦洁, 2020, Python: 使用正则表达式从文本中定位并提取想要的内容, 连享会 No.91.
- 秦利宾, 2020, Stata 与 Jupyter Notebook 关联的两种方法, 连享会 No.136.
- 许梦洁, 2020, 使用 Jupyter Notebook 配置 Stata\Python\Julia\R, 连享会 No.84.
- 韩少真, 展金永, 2020, 珠联璧合 II:Jupyter Notebook 与 Matlab 之融合, 连享会 No.116.
- 刘欣妍, 2022, Stata与Python等价命令, 连享会 No.955.
- 连玉君, 2020, Stata程序:是否有类似-Python-中的-zip()-函数, 连享会 No.347.
-
田原, 2020, ES 期望损失: Stata 及 Python 实现, 连享会 No.182.
- 秦利宾, 许梦洁, 2021, Python+Stata:如何获取中国气象历史数据, 连享会 No.793.
- 李青塬, 2022, Stata+Python:同花顺里爬取创历史新高的股票, 连享会 No.957.
- 李青塬, 2022, Stata+Python:爬取创历史新高股票列表, 连享会 No.894.
- 梁海, 2020, Python:爬取东方财富股吧评论进行情感分析, 连享会 No.440.
- 梁淑珍, 2022, Python:计算管理层讨论与分析的余弦相似度, 连享会 No.995.
- 王文韬, 2020, Python爬虫: 《经济研究》研究热点和主题分析, 连享会 No.88.
- 田原, 2020, VaR 风险价值: Stata 及 Python 实现, 连享会 No.179.
- 田原, 2020, 支持向量机:Stata 和 Python 实现, 连享会 No.149.