Py学习  »  Python

Python金融分析系列-1:日期和时间变量的处理和转换

连享会 • 1 年前 • 325 次点击  

👇 连享会 · 推文导航 | www.lianxh.cn

连享会课程 · 2024 Stata 寒假班

 相比往年课程的更新内容:全新的「进阶班」,由中山大学杨海生老师主讲,包括三个全新专题:C1. 政策效应估计;C2. 政策机制分析;C3. 政策效能优化。主要用于回答如下实证研究问题:

  • 一项政策可以通过哪些路径或机制产生效果?最重要的机制是什么?
  • 在 A 地实施的某项政策能否推广到 B 地?适用条件是什么?
  • 现有政策能否优化 (比如调整激励对象、改变激励强度等)?
  • 能否让政策制定兼顾效率和公平性?

显然,主流期刊广泛关注的主题 (如扶贫、限购、税收优惠、数字化、灵活就业等),都可以从上述视角做更深入地挖掘。这为我们选择新的研究切入点提供了广泛的空间:我们不用再疲于奔命寻找新的「政策冲击」,而是深挖「政策作用机制」、「政策优化」、「政策公平性」等更有意思的话题。

 进阶班将介绍一组能实现上述研究目标的工具,主要包括:

  • 联邦因果推断和联邦 DID;
  • 高维中介分析、因果路径分析、路径相对重要性分析;
  • 政策学习、基于「多臂 Qini 曲线」的政策公平性评价方法;
  • 适用于连续型政策处理变量的非参数因果推断方法。

作者:陈卓然 (北京大学)
邮箱:chenzhr25@mail2.sysu.edu.cn

在经济学的研究当中,特别是有关金融学的研究中,时间是一个非常重要的变量。在很多情况下,由于日期和时间的形式多种多样,处理起来难免会遇到各种各样的问题。为此,本推文将介绍 Python 中处理时间和日期变量的几种方式。本推文主要介绍在如下三种环境下处理时间日期数据的方式:

  • Python
  • Numpy
  • Pandas

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:

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(2020103110530500000)
str(d)
'2020-10-31 10:05:30.500000'

我们可以提取这个类的年,月,日,小时等。

d.year, d.month, d.hour, d.second



    
(2020101030)

我们可以将 datetime 转成序数:

o = d.toordinal()

或者反过来:

dt.datetime.fromordinal(o)

我们可以将 datetime 分割出 datetime

t = dt.datetime.time(d)
t
datetime.time(10530500000)
dd = dt.datetime.date(d)
dd
datetime.date(20201031)

我们也可以计算两个时间点之间的跨度:

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

DirectiveDescriptionExample
%aWeekday, short versionWed
%AWeekday, full version Wednesday
%wWeekday as a number 0-6, 0 is Sunday3
%dDay of month 01-3131
%bMonth name, short versionDec
%BMonth name, full versionDecember
%mMonth as a number 01-1212
%yYear, short version, without century18
%YYear, full version2018
%HHour 00-2317
%IHour 00-1205
%pAM/PMPM
%MMinute 00-5941
%SSecond 00-5908
%fMicrosecond 000000-999999548513
%zUTC offset+0100
%ZTimezoneCST
%jDay number of year 001-366365
%UWeek number of year, Sunday as the first day of week, 00-5352
%WWeek number of year, Monday as the first day of week, 00-5352
%c Local version of date and timeMon Dec 31 17:41:00 2018
%CCentury20
%xLocal version of date12/31/18
%XLocal version of time17:41:00
%%A % character%
%GISO 8601 year2018
%uISO 8601 weekday (1-7)1
%VISO 8601 weeknumber (01-53)01

另外一个好用的函数是 strptime 这个命令可以将任意形式的日期时间字符串转换成datetime格式的字符串。

dt.datetime.strptime('2017-03-31''%Y-%m-%d')
datetime.datetime(201733100)

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 的类,这个类作为 datetimedatetime64 的替代。

ts = pd.Timestamp('2020-10-06')
ts
Timestamp('2020-10-06 00:00:00')
# datetime object from Timestamp object
ts.to_pydatetime()
datetime.datetime(202010600)

另外一个非常有用的类是 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

  • 专题:Python-R-Matlab
    • 初虹, 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.
  • 专题:Stata入门
    • 秦利宾, 2020, Stata 与 Jupyter Notebook 关联的两种方法, 连享会 No.136.
    • 许梦洁, 2020, 使用 Jupyter Notebook 配置 Stata\Python\Julia\R, 连享会 No.84.
    • 韩少真, 展金永, 2020, 珠联璧合 II:Jupyter Notebook 与 Matlab 之融合, 连享会 No.116.
  • 专题:Stata命令
    • 刘欣妍, 2022, Stata与Python等价命令, 连享会 No.955.
  • 专题:Stata程序
    • 连玉君, 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.

课程推荐:Stata2R:针对 Stata 用户的 R 课程
主讲老师:游万海 (福州大学)
课程时间:2023 年 12 月 3/10/17 (三个周日)
🍓 课程主页https://www.lianxh.cn

New! Stata 搜索神器:lianxh 和 songbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
  . ssc install lianxh
  . ssc install songbl
👉  使用:
  . lianxh DID 倍分法
  . songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/164519
 
325 次点击