我绞尽脑汁想找出最好的办法.我想找到前30天的滚动和,但我的'日'列不是日期时间格式.

样本数据

df = pd.DataFrame({'client': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B'], 
                   'day': [319, 323, 336, 352, 379, 424, 461, 486, 496, 499, 303, 334, 346, 373, 374, 395, 401, 408, 458, 492],
                   'foo': [5.0, 2.0, np.nan, np.nan, np.nan, np.nan, np.nan, 7.0, np.nan, np.nan, 8.0, 7.0, 22.0, np.nan, 13.0, np.nan, np.nan, 5.0, 11.0, np.nan]}

>>> df
   client  day   foo
0       A  319   5.0
1       A  323   2.0
2       A  336   NaN
3       A  352   NaN
4       A  379   NaN
5       A  424   NaN
6       A  461   NaN
7       A  486   7.0
8       A  496   NaN
9       A  499   NaN
10      B  303   8.0
11      B  334   7.0
12      B  346  22.0
13      B  373   NaN
14      B  374  13.0
15      B  395   NaN
16      B  401   NaN
17      B  408   5.0
18      B  458  11.0
19      B  492   NaN

我想要一个新的专栏,每30天显示一次‘foo’的滚动总和.

到目前为止,我已经try 了:

df['foo_30day'] = df.groupby('client').rolling(30, on='day', min_periods=1)['foo'].sum().values

但看起来像是最后30行的滚动和.

我也在考虑可能将'day'列更改为日期时间格式,然后使用rolling('30D'),但我不确定如何或甚至这是否是最好的方法.我也试着使用groupby reindex来扩展'day'列,并做一个简单的rolling(30),但它对我不起作用.

任何建议都将不胜感激.

推荐答案

您可以将日期转换为日期时间,然后使用window='30D'.这些天将被转换为日期时间,日期从Pandas中第一个可能的日期开始(1970—01—01).

您可以 Select 在to_datetime中使用origin属性指定开始日期,但对于您的示例来说,这并不重要.

df = df.sort_values("day").reset_index(drop=True)
df["day_datetime"] = pd.to_datetime(df["day"], unit="D")

df["foo_30day"] = (
    df.groupby("client")
    .rolling("30D", on="day_datetime", min_periods=1)["foo"]
    .sum()
    .values
)
   client  day   foo day_datetime  foo_30day
0       B  303   8.0   1970-10-31        5.0
1       A  319   5.0   1970-11-16        7.0
2       A  323   2.0   1970-11-20        7.0
3       B  334   7.0   1970-12-01        2.0
4       A  336   NaN   1970-12-03        NaN
5       B  346  22.0   1970-12-13        NaN
6       A  352   NaN   1970-12-19        NaN
7       B  373   NaN   1971-01-09        7.0
8       B  374  13.0   1971-01-10        7.0
9       A  379   NaN   1971-01-15        7.0
10      B  395   NaN   1971-01-31        8.0
11      B  401   NaN   1971-02-06        7.0
12      B  408   5.0   1971-02-13       29.0
13      A  424   NaN   1971-03-01       22.0
14      B  458  11.0   1971-04-04       35.0
15      A  461   NaN   1971-04-07       13.0
16      A  486   7.0   1971-05-02       13.0
17      B  492   NaN   1971-05-08        5.0
18      A  496   NaN   1971-05-12       11.0
19      A  499   NaN   1971-05-15        NaN

Python相关问答推荐

如果条件为真,则Groupby.mean()

Pytest两个具有无限循环和await命令的Deliverc函数

Pandas 有条件轮班操作

Python 约束无法解决n皇后之谜

如何在Windows上用Python提取名称中带有逗号的文件?

运行终端命令时出现问题:pip start anonymous"

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

Python,Fitting into a System of Equations

如何在Python脚本中附加一个Google tab(已经打开)

多处理队列在与Forking http.server一起使用时随机跳过项目

计算分布的标准差

字符串合并语法在哪里记录

CommandeError:模块numba没有属性generated_jit''''

基于多个数组的多个条件将值添加到numpy数组

polars:有效的方法来应用函数过滤列的字符串

在极点中读取、扫描和接收有什么不同?

用fft计算指数复和代替求和来模拟衍射?

如何将返回引用的函数与pybind11绑定?

我可以不带视频系统的pygame,只用于游戏手柄输入吗?''

为什么dict. items()可以快速查找?