【问题标题】:Create a new DataFrame using pandas date_range使用 pandas date_range 创建一个新的 DataFrame
【发布时间】:2023-01-10 21:30:39
【问题描述】:

我有以下数据框:

   date_start          date_end
0  2023-01-01 16:00:00 2023-01-01 17:00:00
1  2023-01-02 16:00:00 2023-01-02 17:00:00
2  2023-01-03 16:00:00 2023-01-03 17:00:00
3  2023-01-04 17:00:00 2023-01-04 19:00:00
4  NaN                 NaN

我想创建一个新的 DataFrame,它将包含从每行的 date_start 开始到 date_end 结束的值。 所以对于第一行,使用下面的代码:

new_df = pd.Series(pd.date_range(start=df['date_start'][0], end=df['date_end'][0], freq= '15min'))

我得到以下信息:

0   2023-01-01 16:00:00
1   2023-01-01 16:15:00
2   2023-01-01 16:30:00
3   2023-01-01 16:45:00
4   2023-01-01 17:00:00

如何在新的 df 中组合 df 的所有行得到相同的结果?

【问题讨论】:

    标签: python pandas date range


    【解决方案1】:

    您可以使用列表理解和concat

    out = pd.concat([pd.DataFrame({'date': pd.date_range(start=start, end=end,
                                                         freq='15min')})
                      for start, end in zip(df['date_start'], df['date_end'])],
                    ignore_index=True))
    

    输出:

                      date
    0  2023-01-01 16:00:00
    1  2023-01-01 16:15:00
    2  2023-01-01 16:30:00
    3  2023-01-01 16:45:00
    4  2023-01-01 17:00:00
    5  2023-01-02 16:00:00
    6  2023-01-02 16:15:00
    7  2023-01-02 16:30:00
    8  2023-01-02 16:45:00
    9  2023-01-02 17:00:00
    10 2023-01-03 16:00:00
    11 2023-01-03 16:15:00
    12 2023-01-03 16:30:00
    13 2023-01-03 16:45:00
    14 2023-01-03 17:00:00
    15 2023-01-04 17:00:00
    16 2023-01-04 17:15:00
    17 2023-01-04 17:30:00
    18 2023-01-04 17:45:00
    19 2023-01-04 18:00:00
    20 2023-01-04 18:15:00
    21 2023-01-04 18:30:00
    22 2023-01-04 18:45:00
    23 2023-01-04 19:00:00
    

    处理 NA:

    out = pd.concat([pd.DataFrame({'date': pd.date_range(start=start, end=end,
                                                         freq='15min')})
                      for start, end in zip(df['date_start'], df['date_end'])
                      if pd.notna(start) and pd.notna(end)
                    ],
                    ignore_index=True)
    

    【讨论】:

    • @谢谢mozway!如果有 NaN,我会收到以下错误:ValueError: Neither start` 和 end can be NaT`。我如何忽略 NaN?
    • 您可以先运行df2 = df.dropna(['date_start', 'date_end']),然后在列表理解中使用df2。或者在列表理解的末尾添加if pd.notna(start) and pd.notna(end)作为测试
    【解决方案2】:

    在之前的回答中添加 date_range 有一个 to_series() 方法,您也可以这样进行:

    pd.concat(
      [
        pd.date_range(start=row['date_start'], end=row['date_end'], freq= '15min').to_series()
        for _, row in df.iterrows()
      ], ignore_index=True
    )
    

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 2021-04-15
      • 2019-05-05
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      相关资源
      最近更新 更多