编程语言
首页 > 编程语言> > python-使熊猫与摆锤一起使用

python-使熊猫与摆锤一起使用

作者:互联网

我最近偶然发现了一个很棒的新pendulum library,可以更轻松地处理日期时间.

在熊猫中,有一个方便的to_datetime() method可以将系列和其他对象转换为日期时间:

raw_data['Mycol'] = pd.to_datetime(raw_data['Mycol'], format='%d%b%Y:%H:%M:%S.%f')

创建自定义商品的规范方法是什么?方法 –
 在这种情况下,to_pendulum()方法将能够将一系列日期字符串直接转换为Pendulum objects

这可能会导致Series具有各种有趣的功能,例如将一系列日期字符串转换为一系列“offsets from now” – human datetime diffs.

解决方法:

What would be the canonical way to create a custom to_<something>
method – in this case to_pendulum() method which would be able to
convert Series of date strings directly to Pendulum objects?

在浏览了一下API之后,我必须说我对他们所做的事情印象深刻.不幸的是,我不认为Pendulum和熊猫可以一起工作(至少在当前最新版本-v0.21中).

最重要的原因是熊猫本身并不支持Pendulum作为数据类型.所有本机支持的数据类型(np.int,np.float和np.datetime64)都以某种形式支持向量化.使用数据框(例如,普通循环和列表)不会导致性能提升.如果有的话,调用带有Pendulum对象的Series上的apply会更慢(因为所有API开销).

另一个原因是,摆锤是日期时间的子类-

from datetime import datetime

isinstance(pendulum.now(), datetime)
True

这很重要,因为如上所述,datetime是受支持的数据类型,因此pandas将尝试将datetime强制转换为pandas的本机datetime格式-Timestamp.这是一个例子.

print(s)

0     2017-11-09 18:43:45
1     2017-11-09 20:15:27
2     2017-11-09 22:29:00
3     2017-11-09 23:42:34
4     2017-11-10 00:09:40
5     2017-11-10 00:23:14
6     2017-11-10 03:32:17
7     2017-11-10 10:59:24
8     2017-11-10 11:12:59
9     2017-11-10 13:49:09

s = s.apply(pendulum.parse)
s

0    2017-11-09 18:43:45+00:00
1    2017-11-09 20:15:27+00:00
2    2017-11-09 22:29:00+00:00
3    2017-11-09 23:42:34+00:00
4    2017-11-10 00:09:40+00:00
5    2017-11-10 00:23:14+00:00
6    2017-11-10 03:32:17+00:00
7    2017-11-10 10:59:24+00:00
8    2017-11-10 11:12:59+00:00
9    2017-11-10 13:49:09+00:00
Name: timestamp, dtype: datetime64[ns, <TimezoneInfo [UTC, GMT, +00:00:00, STD]>]

s[0]
Timestamp('2017-11-09 18:43:45+0000', tz='<TimezoneInfo [UTC, GMT, +00:00:00, STD]>')

type(s[0])
pandas._libs.tslib.Timestamp

因此,有些困难(涉及dtype = object),您可以将Pendulum对象加载到数据帧中.这是您的做法-

v = np.vectorize(pendulum.parse)
s = pd.Series(v(s), dtype=object)

s

0     2017-11-09T18:43:45+00:00
1     2017-11-09T20:15:27+00:00
2     2017-11-09T22:29:00+00:00
3     2017-11-09T23:42:34+00:00
4     2017-11-10T00:09:40+00:00
5     2017-11-10T00:23:14+00:00
6     2017-11-10T03:32:17+00:00
7     2017-11-10T10:59:24+00:00
8     2017-11-10T11:12:59+00:00
9     2017-11-10T13:49:09+00:00

s[0]
<Pendulum [2017-11-09T18:43:45+00:00]>

但是,这实际上是没有用的,因为调用任何钟摆方法(通过应用)现在不仅会非常慢,而且最终结果将再次被强制为时间戳,这是徒劳的.

标签:python,pandas,datetime,date,pendulum
来源: https://codeday.me/bug/20191010/1886784.html