将每小时数据聚合到 R 中多个 .TXT 文件的每日聚合中

问题描述 投票:0回答:1

我有多个以下格式的 .TXT 文件:

V1 V2 V3 V4
00000000000101428920180101000000+0120180101001500+01 0.22500000000000 W 千瓦时
00000000000101428920180101001500+0120180101003000+01 1.42500000000000 W 千瓦时

其中:V1,V3,V4 = 字符 & V2 = 数字

而V1(时间戳)由以下组成:

  • 000000000001014289->个人资料号码,18位(id=1-18)
  • 20180101000000+01 -> 测量间隔的开始时间(start=19-32)
  • 20180101001500+01 -> 测量间隔结束时间(结束= 35-48)

时间戳的结构如下: 例如。 20140701021500+02

2014 -> YYYY,年 // 07 -> MM,月 // 01 -> DD,日 // 02 -> hh,小时 // 15 -> 毫米,分钟 // 00 -> ss,秒 // + 02 -> [+-]zz,时区

我的目标是将每小时数据汇总为每个 ID 的每日千瓦时值。

所需的最终输出应如下所示:

id 开始日期 千瓦时
1045289 14.01.01 12.5000
1045289 14.02.01 17.4820

我设法单独对每个文件执行此操作,但不能同时对所有文件执行此操作。特别是,我在将单个 .TXT 文件合并为一个文件时遇到了麻烦。

对于单个 .TXT 文件,我使用以下代码进行聚合:

daten <- read.fwf("daten.txt", widths = c(18, 17, 17, 30, 2, 5),
                  col.names = c("ID", "start_date", "end_date", "kWh", "wahr", "unit"))

daten$start_date <- as.POSIXct(strptime(substr(daten$start_date, 1, 14), format = "%Y%m%d%H%M%S"), tz = "UTC")
daten$end_date <- as.POSIXct(strptime(substr(daten$end_date, 1, 14), format = "%Y%m%d%H%M%S"), tz = "UTC")

daten <- daten %>%
  select(ID, start_date, end_date, kWh = kWh, wahr, unit)

data_dailyvalues <- daten %>%
  group_by(ID, start_date = as.Date(start_date)) %>%
  summarize(e_kwh = sum(kWh), .groups = 'drop')

为了合并 .TXT 文件,我使用了:

data <- list.files(
  pattern = "*.TXT",
  full.names=T) %>%
  lapply(read_delim) %>%
  bind_rows()
)

但我收到以下错误消息:

Error in `bind_rows()`:
! Can't combine `..9$0.00000000000000` <double> and `..10$0.00000000000000` <character>.
Run `rlang::last_trace()` to see where the error occurred.
Warning messages:
1: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
  dat <- vroom(...)
  problems(dat) 
...

非常感谢您的帮助。

r merge aggregate txt
1个回答
0
投票

看起来

read_delim
对不同文件的列类型进行了不同的猜测(即,它将一个解释为双精度,一个解释为字符)。因此,它无法绑定结果数据帧之间的列。

您可以通过在

col_types
中显式提供
read_delim
参数来覆盖(不正确的)猜测。在没有看到原始数据的情况下很难提供您需要的确切代码,但这就是一般想法......

© www.soinside.com 2019 - 2024. All rights reserved.