如何在 Julia 中对 DateTime 或 Time 类型进行取模?
How to perform modulo on DateTime or Time type in Julia?
我在 DataFrame 中有一些时间实验数据。我想将时间戳四舍五入到最接近的 10 秒,然后删除所有不在偶数分钟的行。除了下面的最后一步,我什么都有。
df = DataFrame()
df.Time = ["11:05:02", "11:05:23", "11:05:34", "11:05:42", "11:06:01"]
df.Data = rand(5)
df.Time = DateTime.(df.Time, DateFormat("H:M:S")) # I would rather just use Time type
df.Time = round.(df.Time, Second(10)) # but round is only defined for DateTime type
julia> df
5×2 DataFrame
Row │ Time Data
│ DateTime Float64
─────┼───────────────────────────────
1 │ 0001-01-01T11:05:00 0.987827
2 │ 0001-01-01T11:05:20 0.534373
3 │ 0001-01-01T11:05:30 0.571214
4 │ 0001-01-01T11:05:40 0.306041
5 │ 0001-01-01T11:06:00 0.209411
julia> filter!(:Time => time -> time % Minute(1) == 0, df)
ERROR: MethodError: no method matching rem(::DateTime, ::Minute)
关于舍入,您总是可以定义一个简单的函数,例如:
function round10(t::Time)
s= second(t) % 10
s <=5 && return t - Second(s)
return t + Second(10-s)
end
这将允许将时间存储为 Time
,即 df.Time = Time.(df.Time, DateFormat("H:M:S"))
。
选择舍入后偶数分钟的行可以完成为
julia> df[minute.(round10.(df.Time)) .% 2 .== 0, :]
1×2 DataFrame
│ Row │ Time │ Data │
│ │ Time │ Float64 │
├─────┼──────────┼──────────┤
│ 1 │ 11:06:01 │ 0.537324 │
或
julia> filter!(:Time => t -> minute(round10(t)) % 2 == 0, df)
1×2 DataFrame
│ Row │ Time │ Data │
│ │ Time │ Float64 │
├─────┼──────────┼──────────┤
│ 1 │ 11:06:01 │ 0.537324 │
我在 DataFrame 中有一些时间实验数据。我想将时间戳四舍五入到最接近的 10 秒,然后删除所有不在偶数分钟的行。除了下面的最后一步,我什么都有。
df = DataFrame()
df.Time = ["11:05:02", "11:05:23", "11:05:34", "11:05:42", "11:06:01"]
df.Data = rand(5)
df.Time = DateTime.(df.Time, DateFormat("H:M:S")) # I would rather just use Time type
df.Time = round.(df.Time, Second(10)) # but round is only defined for DateTime type
julia> df
5×2 DataFrame
Row │ Time Data
│ DateTime Float64
─────┼───────────────────────────────
1 │ 0001-01-01T11:05:00 0.987827
2 │ 0001-01-01T11:05:20 0.534373
3 │ 0001-01-01T11:05:30 0.571214
4 │ 0001-01-01T11:05:40 0.306041
5 │ 0001-01-01T11:06:00 0.209411
julia> filter!(:Time => time -> time % Minute(1) == 0, df)
ERROR: MethodError: no method matching rem(::DateTime, ::Minute)
关于舍入,您总是可以定义一个简单的函数,例如:
function round10(t::Time)
s= second(t) % 10
s <=5 && return t - Second(s)
return t + Second(10-s)
end
这将允许将时间存储为 Time
,即 df.Time = Time.(df.Time, DateFormat("H:M:S"))
。
选择舍入后偶数分钟的行可以完成为
julia> df[minute.(round10.(df.Time)) .% 2 .== 0, :]
1×2 DataFrame
│ Row │ Time │ Data │
│ │ Time │ Float64 │
├─────┼──────────┼──────────┤
│ 1 │ 11:06:01 │ 0.537324 │
或
julia> filter!(:Time => t -> minute(round10(t)) % 2 == 0, df)
1×2 DataFrame
│ Row │ Time │ Data │
│ │ Time │ Float64 │
├─────┼──────────┼──────────┤
│ 1 │ 11:06:01 │ 0.537324 │