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
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)