代码之家  ›  专栏  ›  技术社区  ›  john

将系列添加到熊猫数据帧

  •  0
  • john  · 技术社区  · 7 年前

    到目前为止我拥有的:

    p_md["Finish"] = pd.Timestamp(datetime(p_md.index.year, p_md.index.month, p_md.index.day, 23, 0, 0))
    
    p_md.loc[(p_md.index.hour > 17), "Finish"] = p_md.Finish + pd.Timedelta(days=1)
    

    当我这样做时,我得到一个TypeError,指出datetime构造函数得到的是int64Index而不是int

    p_md["Finish"] = pd.Timestamp(datetime(p_md.index.year[0], p_md.index.month[0], p_md.index.day[0], 23, 0, 0))
    

    这将编译并运行,但它仅使用数据帧值的第一行,可能是由于[0]。

    表格创建代码请求:

    df = pd.DataFrame()
    
    df['DateTime'] = pd.date_range("1/1/2017", periods=500, freq="H")
    df.set_index("DateTime", inplace=True)
    df["Test"] = 0
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Vico    7 年前

    如果我理解正确,我会将“Finish”创建为:

    p_md["Finish"] = p_md.index
    

    https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.apply.html )函数以获得所需的输出:

    p_md["Finish"] = p_md["Finish"].apply(lambda dt: pd.Timestamp(dt.year, dt.month, dt.day, 23, 0 ,0) + pd.Timedelta(days=1) 
                                                     if dt.hour > 17 else pd.Timestamp(dt.year, dt.month, dt.day, 23, 0 ,0))
    

    或者,您可以创建一个单独的函数并将其分配给应用程序:

    def cvt_date(dt):
        new_dt = pd.Timestamp(dt.year, dt.month, dt.day, 23, 0 ,0)
        if dt.hour > 17:  new_dt = new_dt + pd.Timedelta(days=1)
        return new_dt
    
    p_md['Finish'] = p_md['Finish'].apply(cvt_date)
    

    以下是我获得的原始数据和输出:



    2016-12-11 19:13:54 - 2016-12-12 23:00:00