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:无
另外,有关我的用例的一些信息:
我想将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)]