首页 > 解决方案 > 用一年的 1/10 重采样 df,而不是每天、每月等

问题描述

我有一个大型 csv 文件,其中包含大约 100 个不同品牌的 20 多年录音。包含在 csv 文件中并按年份分组的原始数据示例如下所示。

name                year    value
brand1             2000     3
brand2             2000     3
brand3             2000     1
brand4             2000     0
brand5             2000     3
brand6             2000     1
brand7             2000     1
brand8             2000     3
brand9             2000     1
brand10            2000     3
brand11            2000     1
brand12            2000     0
brand13            2000     0
brand14            2000     3
brand15            2000     3
brand16            2000     0
brand17            2000     0
brand18            2000     0
brand19            2000     1
brand20            2000     0

brand1             2001     6
brand2             2001     4
brand3             2001     2
brand4             2001     1
brand5             2001     4
brand6             2001     2
brand7             2001     4
brand8             2001     4
brand9             2001     1
brand10            2001     6
brand11            2001     4
brand12            2001     0
brand13            2001     0
brand14            2001     3
brand15            2001     4
brand16            2001     1
brand17            2001     0
brand18            2001     0
brand19            2001     4
brand20            2001     3

我能够将其重新采样为每日、每月、每季度等。在挣扎了第三天之后,我仍然无法按名称对数据进行分组并使用一年的 1/10 对其进行重新采样,然后插入值列。

下面是所需的最终输出数据的示例。

name           year          value
brand1         1999          0.0
brand1         1999.1        0.3
brand1         1999.2        0.6
brand1         1999.3        0.9
brand1         1999.4        1.2
brand1         1999.5        1.5
brand1         1999.6        1.8
brand1         1999.7        2.1
brand1         1999.8        2.4
brand1         1999.9        2.7
brand1         2000          3.0

brand1         2000          3.0
brand1         2000.1        3.3
brand1         2000.2        3.6
brand1         2000.3        3.9
brand1         2000.4        4.2
brand1         2000.5        4.5
brand1         2000.6        4.8
brand1         2000.7        5.1
brand1         2000.8        5.4
brand1         2000.9        5.7
brand1         2001          6.0

我希望我的 csv 中的所有数据都像这样。

在使用 TimedeltaIndex 的许多试验中,它没有结果。

有没有办法我可以使用任何其他方法或使用 pandas 中的 timedeltaindex 来实现所需的结果。

我希望我的数据以这种格式呈现,因为对重采样的任何更改都会花费我很长时间来修改我已经拥有的代码。

标签: pythonrpandasdata-manipulationtimedelta

解决方案


在 R 中,library(data.table)我们可以使用

dt[dt[, .(year = seq.int(year[1], year[.N], 0.1)), by=name], on=c('year', 'name')][, 
  value := zoo::na.approx(value, na.rm = FALSE)]

这使

#         name   year value
# 1:    brand1 2000.0   3.0
# 2:    brand1 2000.1   3.3
# 3:    brand1 2000.2   3.6
# 4:    brand1 2000.3   3.9
# 5:    brand1 2000.4   4.2
# ---                     
# 216: brand20 2000.6   1.8
# 217: brand20 2000.7   2.1
# 218: brand20 2000.8   2.4
# 219: brand20 2000.9   2.7
# 220: brand20 2001.0   3.0

数据:

dt = fread("
name               year    value
brand1             2000     3
brand2             2000     3
brand3             2000     1
brand4             2000     0
brand5             2000     3
brand6             2000     1
brand7             2000     1
brand8             2000     3
brand9             2000     1
brand10            2000     3
brand11            2000     1
brand12            2000     0
brand13            2000     0
brand14            2000     3
brand15            2000     3
brand16            2000     0
brand17            2000     0
brand18            2000     0
brand19            2000     1
brand20            2000     0
brand1             2001     6
brand2             2001     4
brand3             2001     2
brand4             2001     1
brand5             2001     4
brand6             2001     2
brand7             2001     4
brand8             2001     4
brand9             2001     1
brand10            2001     6
brand11            2001     4
brand12            2001     0
brand13            2001     0
brand14            2001     3
brand15            2001     4
brand16            2001     1
brand17            2001     0
brand18            2001     0
brand19            2001     4
brand20            2001     3"
)

推荐阅读