Pandas: 不能用于带时间戳值的系列

创建于 2017-08-03  ·  3评论  ·  资料来源: pandas-dev/pandas

代码示例,可能的复制示例

import pandas as pd

ts = pd.Series([pd.Timestamp('2017-07-31 20:08:46.110998-04:00'), 
                pd.Timestamp('2017-08-01 20:08:46.110998-04:00'), 
                pd.Timestamp('2017-08-02 20:08:46.110998-04:00')])

def func(elem):
    print(type(elem))
    return elem
print(type(ts))
print(type(ts[0]))

ts.apply(func);

# Prints out:
# <class 'pandas.core.series.Series'>
# <class 'pandas._libs.tslib.Timestamp'>
# <class 'pandas.core.indexes.datetimes.DatetimeIndex'>

问题描述

我有一个带有时间戳而不是索引的系列。 我希望在每个元素上调用apply方法,但不是,而是在DatetimeIndex上调用它。

预期产量





pd.show_versions()

安装的版本

提交:无
的Python:3.6.0.final.0
python位:64
操作系统:Darwin
操作系统版本:16.7.0
机器:x86_64
处理器:i386
字节序:小
LC_ALL:无
朗:en_CA.UTF-8
本地电话:en_CA.UTF-8

熊猫:0.20.2
pytest的:3.0.5
点:9.0.1
setuptools:35.0.1
Cython:无
numpy的:1.13.0
scipy:0.19.1
的xarray:0.9.6
IPython:6.0.0
狮身人面像:1.5.3
patsy:无
dateutil的:2.6.0
pytz:2016.10
blosc:无
瓶颈:1.2.0
桌子:无
numexpr:无
羽毛:无
matplotlib:2.0.0
openpyxl:2.4.8
xlrd:1.0.0
xlwt:无
xlsxwriter:0.9.8
lxml:无
bs4:无
html5lib:0.999
sqlalchemy:无
pymysql:无
psycopg2:无
jinja2:2.9.5
s3fs:无
pandas_gbq:无
pandas_datareader:无

Timezones Usage Question

所有3条评论

另外,有关我的用例的一些信息:

我想将tz_localize方法应用于系列中的每个时间戳。 我最初在该系列本身上尝试过tz_localize ,但这引起了

TypeError: index is not a valid DatetimeIndex or PeriodIndex

我意识到可以通过使用reindex来实现这一点,但是我想知道是否也可以使用Timestamps作为Series值来实现这一点。

@nathanielatom,您可以通过dt访问器在系列上使用tz_localize / tz_convert

In [19]: ts.dt.tz_convert('UTC')
Out[19]: 
0   2017-08-01 00:08:46.110998+00:00
1   2017-08-02 00:08:46.110998+00:00
2   2017-08-03 00:08:46.110998+00:00
dtype: datetime64[ns, UTC]

此外,使用apply获得看到的输出的原因是,apply首先会尝试对所有值调用函数(尽管这些值是Series的值,但它们都作为DatetimeIndex保留在幕后。 ),并且只有在失败的情况下,才会在每个元素上调用该函数。

如果您在未获得标量值的情况下对函数进行了一些调整以提高它,则会看到预期的输出:

In [21]: def func(elem):
    ...:     assert not hasattr(elem, 'ndim')
    ...:     print(type(elem))
    ...:     return elem
    ...: 

In [22]: ts.apply(func)
<class 'pandas._libs.tslib.Timestamp'>
<class 'pandas._libs.tslib.Timestamp'>
<class 'pandas._libs.tslib.Timestamp'>
Out[22]: 
0   2017-07-31 20:08:46.110998-04:00
1   2017-08-01 20:08:46.110998-04:00
2   2017-08-02 20:08:46.110998-04:00
dtype: datetime64[ns, pytz.FixedOffset(-240)]
此页面是否有帮助?
0 / 5 - 0 等级