首页 > 解决方案 > 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]))一个范围来创建一个系列,但我认为它效率不高。

标签: pandasdataframe

解决方案


感谢@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 的原始索引系列。


推荐阅读