社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

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

👇 连享会 · 推文导航 | 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
 
368 次点击