pandas - Pandas DataFrame:如何获取时间序列中的原始索引
问题描述
我有一个来自 csv 文件的 Pandas DataFrame,它的索引是日期。
df = pd.read_csv('data.csv', index_col=0, parse_dates=True)
df.index
DatetimeIndex(['2010-01-01', '2010-01-04', '2010-01-05', '2010-01-06',
'2010-01-07', '2010-01-08', '2010-01-11', '2010-01-12',
'2010-01-13', '2010-01-14',
...
'2018-06-18', '2018-06-19', '2018-06-20', '2018-06-21',
'2018-06-22', '2018-06-25', '2018-06-26', '2018-06-27',
'2018-06-28', '2018-06-29'],
dtype='datetime64[ns]', name='Date', length=2216, freq=None)
我需要根据每行的索引号计算值,但df.index
返回DatetimeIndex
. 如何获取每行的原始索引号系列?
预计:
df.raw_index # return a Series [0, 1, 2, 3, ...]
df['result'] = (df.raw_index + 1) ** 2 ## [1, 4, 9, 16, ...]
我可以用pd.Series(range(0, df.shape[0]))
一个范围来创建一个系列,但我认为它效率不高。
解决方案
感谢@anky 的评论和这个答案。我比较性能:
%timeit df.reset_index().index
549 µs ± 8.52 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit pd.Series(range(0, df.shape[0]))
81 µs ± 1.33 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit np.arange(result.shape[0])
3.15 µs ± 27 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.arange(len(df))
2.76 µs ± 48.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.arange(len(df.index))
2.51 µs ± 18.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
# df.index is well performant, but it returns DatetimeIndex, not raw indexes.
%timeit df.index
127 ns ± 0.5 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
我仍在寻找更高效/高性能的方法来获取日期时间索引 DataFrame 的原始索引系列。
推荐阅读
- python - 在 Python 中触发 sql 查询时出现数据库错误
- android - 如何从 AOSP 构建中删除计算器应用程序
- java - 我们可以在三元运算符(Java)中使用命令吗?
- javascript - 页面路由在 Angular 8 中无法正常工作
- python - Lambda python - 标记 EC2 实例的条件
- java - SQLException pg_get_serial_sequence NOT FOUND
- reactjs - 我们如何在 Jest、酶中访问组件 const 变量
- php - 在 woocommerce 购物车和结帐页面中显示变化数组
- python - 使用布尔掩码为 numpy 数组赋值:如何?
- java - 如何测试受保护的 Spring Controller