对pandas和pendulum的吐槽——TimeStamp numpy的datetime64的转型问题
今天被这俩货因为时间日期处理不兼容的问题折腾半天,气死人,不吐槽不行了!
这俩简称都可以是pd的库,都TM够轴的,互相兼容极差。
pandas 和 pendulum 知名度都很高,也很常用。但我就是用不习惯!各种小坑让我特别不爽。
pandas的api让我觉得奇葩。根本没有其他py库连蒙带猜就能平顺执行的感觉,反正感觉和py风格不太搭。只是个人感觉。用其他知名库从来没这种感觉。
然后它的很多操作,都是列优先的,df['A'] 取一列,然后做某事。这是数据固定,处理数据时方便。
但如果有时偷懒,把Dataframe当成数据库表,想按行操作,就非常别扭。连遍历都得是 for i,r in df.iterrows(): 只能说是相当不py的写法。。
其实现在pd用起来感觉现在稍微好点了,loc iloc, 以前还有乱七八糟的ix之类。还有过想修改覆盖某列时,动不动warning说copy怎么怎么样了,看半天文档我也记不住该怎么搞,还TM挺长。TM老子愿意这样写,TMBB什么啊,(就类似这种,df['c'] = df['c']XXX 记不清了,反正最近好像总算不提示了,你TM api反人类还TM有理了?看几遍TAOUP学学最小立异原则去!)
再说pendulum,首先文档特别没有条理,我从来找不到想用的功能。得一直看很长。感觉特别散
https://pendulum.eustace.io/docs/
很多转型也写不清楚,比如他用isinstance是判断成原生datetime.datetime的,也就是作者希望我们直接用pendulum.DateTime代替datetime.datetime的。
但你TM都欺骗过isinstance了,可以TM倒是把原生的datetime.datetime的属性和方法都TM老实实现了啊。在pd上用,一不留神就直接报告说:
AttributeError: 'DateTime' object has no attribute 'nanosecond'
报错了也TM不改,https://github.com/sdispater/pendulum/issues/246 真是服了。
——懂不懂面向对象的规矩啊!懂不懂里氏替换原则(Liskov)原则啊!?子类能这么写的!?
而且,这也不代表,你自认为能替换原生datatime,就可以故意不写清楚 pendulum.DateTime和datetime.datetime的显式相互转型方法啊?
毕竟很多库还是只认原生datetime的。
pendulum转datetime,这个还好。但是那个问题,api奇葩,不常见,不容易记住
dt = datetime(2008, 1, 1)
>>> p = pendulum.instance(dt)
datetime转pendulum:
我只找到这种,就更奇葩了:要先定义个时区,然后转
to_zone = pendulum.timezone('Asia/Shanghai')
dt = to_zone.convert(dt)
而且2和1代还换过1次API风格。我TM到现在还是觉得1.X的API风格反而强些。
pandas 用的时区是pytz,而pendulum自己搞了一套时区,还特意写一篇文章自称比pytz好很多,但问题是,用的时候就恶心了
按说两个star都很高的库,互相兼容,应该是天经地义的啊。
pandas 如果把类似datetime的列定为index 会被转型成TimeStamp。还可以显示设置为DateTimeIndex,这还不算完
最坑的地方是: 如果我这样
[idx for idx in df.index]
遍历出来的是 TimeStamp型
但如果 [idx for list(df.index.values)]
得到的却是numpy.datetime64型。
最大的区别就是timezone。
大概是这样了:
TimeStamp -> numpy.datetime64
虽然找到了这个图参考,但是其实没解决我的问题。

https://cloud.tencent.com/developer/ask/29186
用比较恶心的方法解决掉这个问题
if isinstance(obj_in, pd.Timestamp):
str_without_tz = obj_in.strftime("%Y-%m-%dT%H:%M:%S")
dt = pendulum.parse(str_without_tz, tz=tzinfo)
elif isinstance(obj_in, np.datetime64):
#'2004-06-07T15:00:00+08:00' -> '2018-02-23T07:00:00.000000000'
# 在self.df.index.values 时遇到 dt.strftime("%Y-%m-%dT%H:%M:%S")得到 2004-06-03T07:00:00+08:00 奇葩无法处理
dt = pd.Timestamp(obj_in)
str_without_tz = dt.strftime("%Y-%m-%dT%H:%M:%S")
#print(str_without_tz)
dt = pendulum.parse(str_without_tz, tz='UTC')
dt = to_zone.convert(dt)
比如pendulum 转 pandas TimeStamp,一不留神就报告DateTime上缺nanosecond属性,github上也有人报这个问题,
我只能这样
def dt2pd(dt):
'''pendulum 和pd不兼容'''
assert isinstance(dt, pendulum.DateTime)
#print(dt)
res_str = dt.strftime("%Y-%m-%dT%H:%M:%S")
#print(res_str)
return pd.Timestamp(res_str, tz=dt.timezone.name)
——总之,接口奇葩,很多地方严重不符合“最小立异原则”,转型时各种坑,是最大的问题。但是你不出他们画的圈,用的话倒还好。
对pandas和pendulum的吐槽——TimeStamp numpy的datetime64的转型问题的更多相关文章
- pandas数据类型(二)与numpy的str和object类型之间的区别
现象: Numpy区分了str和object类型,其中dtype(‘S’)和dtype(‘O’)分别对应于str和object. 然而,pandas缺乏这种区别 str和object类型都对应dtyp ...
- [Pandas] 01 - A guy based on NumPy
主要搞明白NumPy“为什么快”. 学习资源 Panda 中文 易百教程 远程登录Jupyter笔记本 效率进化 四步效率优化 NumPy 底层进行了不错的优化. %timeit 对于任意语句,它会自 ...
- numpy&pandas基础
numpy基础 import numpy as np 定义array In [156]: np.ones(3) Out[156]: array([1., 1., 1.]) In [157]: np.o ...
- 《Python数据分析常用手册》一、NumPy和Pandas篇
一.常用链接: 1.Python官网:https://www.python.org/ 2.各种库的whl离线安装包:http://www.lfd.uci.edu/~gohlke/pythonlibs/ ...
- 【转】python 中NumPy和Pandas工具包中的函数使用笔记(方便自己查找)
二.常用库 1.NumPy NumPy是高性能科学计算和数据分析的基础包.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对整组数据进行快速运算的标准 ...
- 无用之学matplotlib,numpy,pandas
一.matplotlib学习 matplotlib: 最流行的Python底层绘图库,主要做数据可视化图表,名字取材于MATLAB,模仿MATLAB构建 例子1: # coding=utf- from ...
- pandas numpy处理缺失值,none与nan比较
原文链接:https://junjiecai.github.io/posts/2016/Oct/20/none_vs_nan/ 建议从这里下载这篇文章对应的.ipynb文件和相关资源.这样你就能在Ju ...
- 使用pandas时遇到ValueError: numpy.dtype has the wrong size, try recompiling
[问题]使用pandas时遇到ValueError: numpy.dtype has the wrong size, try recompiling [原因] 这是因为 Python 包的版本问题,例 ...
- python3安装pandas执行pip3 install pandas命令后卡住不动的问题及安装scipy、sklearn库的numpy.distutils.system_info.NotFoundError: no lapack/blas resources found问题
一直尝试在python3中安装pandas等一系列软件,但每次执行pip3 install pandas后就卡住不动了,一直停在那,开始以为是pip命令的版本不对,还执行过 python -m pip ...
随机推荐
- Prometheus监控学习笔记之PromQL操作符
0x00 二元运算符 Prometheus 的查询语言支持基本的逻辑运算和算术运算.对于两个瞬时向量, 匹配行为可以被改变. 算术二元运算符 在 Prometheus 系统中支持下面的二元算术运算符: ...
- Windows下用cmd命令实例讲解yii2.0 的控制台定时任务
Yii中的资源是和Web页面相关的文件,可为CSS文件,JavaScript文件,图片或视频等,资源放在Web可访问的目录下,直接被Web服务器调用. 有时候有些功能需要做到计划任务中去,因此就需要y ...
- P3302 [SDOI2013]森林(主席树+启发式合并)
P3302 [SDOI2013]森林 主席树+启发式合并 (我以前的主席树板子是错的.......坑了我老久TAT) 第k小问题显然是主席树. 我们对每个点维护一棵包含其子树所有节点的主席树 询问(x ...
- fjwc2019 D3T1 签到题 (贪心)
#184. 「2019冬令营提高组」签到题 每次询问接近O(1).......考虑贪心 怎么贪心呢? 对于相邻的两个数,我们要保证异或x后单调不降 我们找到两个数二进制上最高的相异位 当左边的数相异位 ...
- Mysql报错java.sql.SQLException:null,message from server:"Host '27,45,38,132' is not allowed to connect
Mysql报错java.sql.SQLException:null,message from server:"Host '27,45,38,132' is not allowed to co ...
- log buffer space等待事件
最近,我们有台服务器在delete操作期间发现一直在等待log buffer space,其他节点就没与这个问题.经查,向重做缓冲区上写入重做记录的进程,为了确保拥有重做缓冲区内必要的空间,需要获得r ...
- topcoder srm 550 div1
problem1 link 因为数据比较小,直接开一个二维数组记录哪些格子已经遍历,哪些还没有.进行模拟即可. problem2 link 模拟一些小数据,可以发现,AB的形状以及要求的区间是下面的样 ...
- topcoder srm 530 div1
problem1 link 对于每个还未切掉的‘X’用cutter作用一次.从左上角到右下角,依次判断即可. problem2 link 首先,如果一个顶点不能从0到达或者不能到达节点$n-1$,那么 ...
- 彻底地/ 终于地, 解决 关于apache 权限的问题了:: 修改 DocumentRoot后的 403错误: have no permission to access / on this server
目录的权限都 应该设置 为 drwxr_xr_x, 即755, 而html下的文件的权限设置为; 644 即可! -x 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性. -w权限, ...
- (转)renren-fast解读(一)
(二期)8.renren-fast项目解读(一) [课程八]预防xss...注入.xmind0.2MB [课程八预习]开...解读.xmind0.5MB 课程八_日志处理与...模块.xmind0.2 ...