【发布时间】:2019-03-12 05:40:09
【问题描述】:
我想在 python 中为固定日期的日期分配索引。例如,索引 1 到 20130101,索引 2 到 20130102 等等,直到 20181231。这些日期在 python 数据框中。可以在数据框中的日期上覆盖索引。有人可以建议如何做到这一点吗?
【问题讨论】:
标签: python pandas datetime series
我想在 python 中为固定日期的日期分配索引。例如,索引 1 到 20130101,索引 2 到 20130102 等等,直到 20181231。这些日期在 python 数据框中。可以在数据框中的日期上覆盖索引。有人可以建议如何做到这一点吗?
【问题讨论】:
标签: python pandas datetime series
您可以减去date 对象。这给出了一个很容易转换为天数的 timedelta。根据您的解释,这听起来与您正在寻找的完全一样:
>>> (datetime.date(2013, 1, 2)-datetime.date(2013, 1, 1)).days
1
>>> (datetime.date(2013, 1, 31)-datetime.date(2013, 1, 1)).days
30
这里,右边的参数是你锚定到的固定日期。
【讨论】:
您可以在字典理解中使用 pandas.date_range 来创建具有所需索引和值的 pandas.Series 对象:
start_date = '20130101'
end_date = '20181231'
date_idx = pd.Series({d:i+1 for i, d in enumerate(pd.date_range(start_date, end_date, freq='D'))})
看起来像:
2013-01-01 1
2013-01-02 2
2013-01-03 3
2013-01-04 4
2013-01-05 5
2013-01-06 6
...
2018-12-26 2186
2018-12-27 2187
2018-12-28 2188
2018-12-29 2189
2018-12-30 2190
2018-12-31 2191
然后,您可以使用 Series.map 将其映射到 pandas.DataFrame 中的任何 datetime 列。例如:
df['date_idx'] = df['date_column'].map(date_idx)
【讨论】:
这里不需要显式循环。你可以使用pd.Series.dt.days:
df = pd.DataFrame({'dates': pd.date_range('2013-01-01', '2018-12-31', freq='D')})
df['index'] = (df['dates'] - df['dates'].iat[0]).dt.days + 1
print(df)
dates index
0 2013-01-01 1
1 2013-01-02 2
2 2013-01-03 3
3 2013-01-04 4
4 2013-01-05 5
... ... ...
2186 2018-12-27 2187
2187 2018-12-28 2188
2188 2018-12-29 2189
2189 2018-12-30 2190
2190 2018-12-31 2191
【讨论】: