Python 根据日期时间条件乘以数据帧行

Python 根据日期时间条件乘以数据帧行,python,pandas,dataframe,datetime,Python,Pandas,Dataframe,Datetime,我有以下示例数据帧: df = pd.DataFrame(columns=['Total_concentration'], index=pd.to_datetime([])) df.loc[pd.Timestamp(year=2017, month=1, day=1, hour=12)] = pd.Series([1], ['Total_concentration']) df.loc[pd.Timestamp(year=2017, month=1, day=2, hour=12)] = pd.S

我有以下示例数据帧:

df = pd.DataFrame(columns=['Total_concentration'], index=pd.to_datetime([]))
df.loc[pd.Timestamp(year=2017, month=1, day=1, hour=12)] = pd.Series([1], ['Total_concentration'])
df.loc[pd.Timestamp(year=2017, month=1, day=2, hour=12)] = pd.Series([2], ['Total_concentration'])
df.loc[pd.Timestamp(year=2017, month=1, day=3, hour=12)] = pd.Series([3], ['Total_concentration'])
df.loc[pd.Timestamp(year=2017, month=1, day=4, hour=12)] = pd.Series([1], ['Total_concentration'])
df.loc[pd.Timestamp(year=2017, month=1, day=5, hour=12)] = pd.Series([2], ['Total_concentration'])
df.loc[pd.Timestamp(year=2017, month=1, day=6, hour=12)] = pd.Series([3], ['Total_concentration'])
我想添加一列“总通量”,即2017-01-02和2017-01-03日期之间的“总浓度”列乘以2,以及2017-01-04和2017-01-05日期之间的“总浓度”列乘以3。即,生成的数据帧如下所示:

df2 = pd.DataFrame(columns=['Total_concentration','Total_flux'], index=pd.to_datetime([]))
df2.loc[pd.Timestamp(year=2017, month=1, day=1, hour=12)] = pd.Series([1,1], ['Total_concentration','Total_flux'])
df2.loc[pd.Timestamp(year=2017, month=1, day=2, hour=12)] = pd.Series([2,4], ['Total_concentration','Total_flux'])
df2.loc[pd.Timestamp(year=2017, month=1, day=3, hour=12)] = pd.Series([3,6], ['Total_concentration','Total_flux'])
df2.loc[pd.Timestamp(year=2017, month=1, day=4, hour=12)] = pd.Series([1,3], ['Total_concentration','Total_flux'])
df2.loc[pd.Timestamp(year=2017, month=1, day=5, hour=12)] = pd.Series([2,6], ['Total_concentration','Total_flux'])
df2.loc[pd.Timestamp(year=2017, month=1, day=6, hour=12)] = pd.Series([3,3], ['Total_concentration','Total_flux'])

执行此操作最有效的方法是什么?

使用切片
DataetimeIndex
的解决方案,然后用原始列替换缺少的值:

df.loc['2017-01-02':'2017-01-03', 'Total_flux'] = df.loc['2017-01-01':'2017-01-03', 'Total_concentration'] * 2
df.loc['2017-01-04':'2017-01-05', 'Total_flux'] = df.loc['2017-01-04':'2017-01-05', 'Total_concentration'] * 3

df['Total_flux'] = df['Total_flux'].fillna(df['Total_concentration'])
print (df)
                    Total_concentration  Total_flux
2017-01-01 12:00:00                   1           1
2017-01-02 12:00:00                   2           4
2017-01-03 12:00:00                   3           6
2017-01-04 12:00:00                   1           3
2017-01-05 12:00:00                   2           6
2017-01-06 12:00:00                   3           3
或可能用于多个和的值:


使用以下代码:

df['Total_flux'] = df.Total_concentration.multiply(pd.cut(df.index.to_series(),
    [pd.Timestamp('2017-01-02'), pd.Timestamp('2017-01-04'), pd.Timestamp('2017-01-06')],
    right=False, labels=[2, 3]).dropna().astype(int), fill_value=1)
计算新列的想法是:

  • 将df的索引剪切到多个箱子中:
    • 2017-01-02和2017-01-04之间,标签为2
    • 2017-01-04和2017-01-06之间,标签为3 (两个范围都在右边缘打开)
  • 将(分类)结果转换为int
  • 用上述结果乘以总_浓度 填充值为1

以下方法可以将子集作为离散序列,但我不确定如何将其放入数据框架:总通量=np.乘法(总浓度['2017-01-02':'2017-01-03'],2)
df['Total_flux'] = df.Total_concentration.multiply(pd.cut(df.index.to_series(),
    [pd.Timestamp('2017-01-02'), pd.Timestamp('2017-01-04'), pd.Timestamp('2017-01-06')],
    right=False, labels=[2, 3]).dropna().astype(int), fill_value=1)