【问题标题】:Pandas operation per date in index索引中每个日期的 Pandas 操作
【发布时间】:2015-11-08 21:28:06
【问题描述】:

对于不同的商品,我在 Pandas 中有以下日期范围:

df = pd.DataFrame([], columns=["Bid", "Ask"], index_col='tid')

填充如下:

2015-07-15 07:16:39.034  49.960  50.000
2015-08-12 07:16:39.235  49.958  49.998

我需要找到每天的滚动平均值。所以我这样提取日期:

dates = set(df.index.map(pd.Timestamp.date))

然后我遍历日期并计算滚动平均值:

for d in dates:
    df['rm200'] = np.round(pd.rolling_mean(df[d]['Bid'], window=200), 5)

这给出了以下错误:

KeyError: datetime.date(2015, 7, 15)

如果我这样添加 str(d):

df['rm200'] = np.round(pd.rolling_mean(df[str(d)]['Bid'], window=200), 5)

错误消失了,但我没有得到滚动平均值。

但是,如果我从错误中复制日期并添加它,我会得到我想要的结果,但出于显而易见的原因,仅针对相关日期:

df['rm200'] = np.round(pd.rolling_mean(df['2015, 7, 15']['Bid'], window=200), 5)

如何遍历日期并分别为每个日期执行操作?

【问题讨论】:

    标签: python datetime pandas dataframe time-series


    【解决方案1】:

    您没有足够的数据进行测试,但我建议如下:

    pd.rolling_mean(df.resample('1B'), window=200)
    

    df.resample('1B') 根据工作日创建一个 DataFrame(您可以指定替代日历),取每一天的平均值(不清楚您的数据是每天只有一个值还是多个值)。

    pd.rolling_mean 只是取最近 200 次每日观察的滚动平均值。

    【讨论】:

    • 不,这不起作用。我每天有大约 50 000 个值。通过使用这种方法,我知道它将采用每天的平均值并为每日平均值创建滚动平均值。我需要每天滚动平均值。就像计算我一天拥有的 50 000 个数据点的滚动平均值一样,第二天重新开始,只使用当天的数据点。
    • 您的问题还不清楚。我假设您有许多商品(例如 CL、C、ED 等)和到期月份。我假设您需要对这些进行某种分组,但尚不清楚您是要对商品还是商品和到期时间进行分组。我相信您发布的问题可能过于宽泛,您应该尝试简化它以澄清您的问题。
    • 好的。感谢您的反馈。我试图清除它并在这里再次询问:stackoverflow.com/questions/32158990/pandas-day-for-day
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 2013-11-18
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多