【问题标题】:How can I give an index value to a specific date in python?如何在 python 中为特定日期赋予索引值?
【发布时间】:2019-03-12 05:40:09
【问题描述】:

我想在 python 中为固定日期的日期分配索引。例如,索引 1 到 20130101,索引 2 到 20130102 等等,直到 20181231。这些日期在 python 数据框中。可以在数据框中的日期上覆盖索引。有人可以建议如何做到这一点吗?

【问题讨论】:

    标签: python pandas datetime series


    【解决方案1】:

    您可以减去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
    

    这里,右边的参数是你锚定到的固定日期。

    【讨论】:

    • 这很有帮助。由于日期范围从 20130101 到 20181231,您能否告诉我如何循环访问这些日期?
    • 这在纯 Python 中是一个很好的答案,但没有利用 Pandas / NumPy 矢量化功能。
    【解决方案2】:

    您可以在字典理解中使用 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)
    

    【讨论】:

      【解决方案3】:

      这里不需要显式循环。你可以使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-08
        • 2020-09-03
        • 1970-01-01
        • 1970-01-01
        • 2021-09-15
        • 1970-01-01
        • 2011-03-02
        • 1970-01-01
        相关资源
        最近更新 更多