以下是一些示例数据:
import pandas as pd
import numpy as np
import string
start_date = '20050101'
drange = pd.date_range(start_date, periods=100, freq='D')
possible_groups = ['A','B','C','D','E','F']
chosen = np.random.choice(possible_groups, len(drange), replace=True)
groups = pd.Series(chosen).apply(lambda x: 'group'+x)
values = np.random.randint(1, 100, len(drange))
dfA = pd.DataFrame({'date':drange, 'grp':groups, 'value':values})
dfB = pd.DataFrame({'date':drange, 'grp':groups})
注意:如果您需要让 datetime 对象在视觉上看起来像 YYYYMMDD,您可以使用 strftime() 并根据需要切换回 datetime,例如:
drange = pd.date_range(start_date, periods=100, freq='D').strftime('%Y%m%d')
现在,假设您出于某种原因需要将这些数据帧分开(即不允许使用merge()),以下应该可以工作。
def plot_range(data, within):
(
dfA.set_index('date')
.loc[dfA.grp.values == data.grp]
.loc[data.date-pd.Timedelta(days=within):
data.date+pd.Timedelta(days=within)]
.plot(title=data.grp)
)
within = 50 # set within to the desired range in days around a date
dfB.apply(plot_range, axis='columns', args=(within,))
以下是几天子集的示例输出:
subset = 3
within = 10
dfB.sample(subset).apply(plot_range, axis='columns', args=(within,))