Pandas DataFrame:如何获取时间序列中的原始索引

时间:2021-03-20 05:31:34

标签: 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])) 按范围创建系列,但我认为效率不高。

1 个答案:

答案 0 :(得分:0)

感谢@anky 的评论和此 answer。我比较了性能:

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