小编tob*_*as_的帖子

计算不同行的列之间的时间差(difftime)

我有不同工作的"开始"和"结束"时间数据,按"所有者"分组:

Data <- data.frame(
  job = c(1, 2, 3, 4, 5),
  owner = c("name1", "name2", "name1", "name1", "name2"),
  Start = as.POSIXct(c("2015-01-01 15:00:00", "2015-01-01 15:01:00", "2015-01-01 15:13:00", "2015-01-01 15:20:00", "2015-01-01 15:39:02"), format="%Y-%m-%d %H:%M:%S"),
  End =   as.POSIXct(c("2015-01-01 15:11:11", "2015-01-01 15:17:21", "2015-01-01 15:17:00", "2015-01-01 15:31:21", "2015-01-01 15:40:11"), format="%Y-%m-%d %H:%M:%S")
)
Run Code Online (Sandbox Code Playgroud)

对于每个所有者,我想计算每个所有者的作业之间的空闲时间,即一个作业的"结束"时间与下一个作业的"开始"时间之间的差异.

如何使用difftime()不同列中的特定行和时间之间的时间差来计算?

结果应如下所示:

job, owner, idletime
1, name1, NA
2, name2, NA
3, name1, 1.816667  # End of row 1 minus Start of row 3
4, name1, 3.0       # End of …
Run Code Online (Sandbox Code Playgroud)

datetime r posixct difftime

2
推荐指数
1
解决办法
1187
查看次数

按虚拟计算字段排序

给定以下架构,我想计算:games_won /:games_played,将其填充到:percentage_won并按:percentage_won进行排序。如果使用select_merge并省略了“ AS”,我设法计算出该值,但是如何在中引用此计算列order_by

schema "players" do
  field :name, :string
  field :games_played, :integer
  field :games_won, :integer

  field :percentage_won, :float, virtual: true

  timestamps()
end
Run Code Online (Sandbox Code Playgroud)

我尝试了以下查询:

def list_players(sort_by, sort_order) do
  query =
    from(p in Player,
      select_merge: %{percentage_won: fragment("(?::decimal / NULLIF(?,0)) AS ?", p.games_won, p.games_played, p.percentage_won)},
      order_by: [{^sort_order, field(p, ^String.to_atom(sort_by))}])
  Repo.all(query)
end
Run Code Online (Sandbox Code Playgroud)

但是打电话list_players("percentage_won", :asc)给我以下错误:

** (Ecto.QueryError) ...:28: field `percentage_won` in `select` is a virtual field in schema Player in query:

from p0 in Player,
  order_by: [asc: p0.name],
  select: …
Run Code Online (Sandbox Code Playgroud)

elixir ecto

2
推荐指数
1
解决办法
115
查看次数

标签 统计

datetime ×1

difftime ×1

ecto ×1

elixir ×1

posixct ×1

r ×1