用一年的1/10而不是每天,每月等重新采样df

时间:2020-01-30 13:52:49

标签: python r pandas data-manipulation timedelta

我有一个大型的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重新采样,然后对value列进行插值。

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

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的试验中,结果没有结果。

有没有办法我可以使用任何其他方法或在熊猫中使用timedeltaindex进行插值以达到所需的结果。

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

1 个答案:

答案 0 :(得分:1)

在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"
)