我正在计算一系列日期时间的加权平均值(肯定是做错了,因为我无法解释以下内容):

import pandas as pd
import numpy as np

foo = pd.DataFrame({'date': ['2022-06-01', '2022-06-16'],
                    'value': [1000, 10000]})
foo['date'] = pd.to_datetime(foo['date'])
bar = np.average(foo['date'].view(dtype='float64'), weights=foo['value'])
print(np.array(bar).view(dtype='datetime64[ns]'))

退货

将月份更改为7月:

foo = pd.DataFrame({'date': ['2022-07-01', '2022-07-16'],
                    'value': [1000, 10000]})
foo['date'] = pd.to_datetime(foo['date'])
bar = np.average(foo['date'].view(dtype='float64'), weights=foo['value'])
print(np.array(bar).view(dtype='datetime64[ns]'))

返回2022-07-14T23:59:53.766924660

在Excel中计算的预期结果:

enter image description here

我忽略了什么?

EDIT: Additional Detail

  • 我的真实数据集要大得多,如果可能的话,我想使用numpy.
  • foo['date']可以假设为没有时间成分的日期,但加权平均值将有一个时间成分.

推荐答案

我强烈怀疑这是一个解决/取整问题.

我假设对于平均日期,这些数据被转换为时间戳,然后结果被转换回datetime对象.但是pandas的工作时间是纳秒,因此分别乘以2**520和2**5200的时间戳值超过了2**52,即超过了64位浮点的尾数能力.

相反,Excel以毫秒为单位工作,所以这里没有问题;Python的datetime.datetime在微秒内工作,因此仍然没有问题:

dt01 = datetime(2022,7,1)
dt16 = datetime(2022,7,16)
datetime.fromtimestamp((dt01.timestamp()*1000 + dt16.timestamp()*10000)/11000)
datetime.datetime(2022, 7, 14, 15, 16, 21, 818182)

因此,如果您需要使用numpy/pandas,我认为您最好的 Select 是将日期从"开始"日期(即定义"自定义历元")转换为时间增量,并计算这些值的加权平均值.

Python相关问答推荐

更改matplotlib彩色条的字体并勾选标签?

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

试图找到Python方法来部分填充numpy数组

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

无法通过python-jira访问jira工作日志(log)中的 comments

在Polars(Python库)中将二进制转换为具有非UTF-8字符的字符串变量

如何在solve()之后获得症状上的等式的值

Godot:需要碰撞的对象的AdditionerBody2D或Area2D以及queue_free?

avxspan与pandas period_range

使用密钥字典重新配置嵌套字典密钥名

将pandas导出到CSV数据,但在此之前,将日期按最小到最大排序

Flash只从html表单中获取一个值

当条件满足时停止ODE集成?

在用于Python的Bokeh包中设置按钮的样式

如何使用Azure Function将xlsb转换为xlsx?

仅使用预先计算的排序获取排序元素

如何将泛型类类型与函数返回类型结合使用?

Python如何导入类的实例

PYTHON中的selenium不会打开 chromium URL

Python键盘模块不会立即检测到按键