Many thanks for the solution and it works well with the example posted.
But, if I have missing values in one of the columns, it throws an error.
sdt2 = DataFrame(ID = 1:2, StartTime = DateTime(["4/13/2016 07:00",
"4/13/2016 07:15"], "m/d/y H:M"),
EndTime = DateTime(["4/13/2016 12:00",
"4/13/2016 12:15"], "m/d/y H:M"),
BreakTime1 = DateTime([NA, "4/13/2016 10:15"],
"m/d/y H:M"),
BreakTime2 = DateTime(["4/13/2016 12:00",
"4/13/2016 12:15"], "m/d/y H:M")
d1= DataFrame(id=Int64[], Time = AbstractString[])
for i in 1:nrow(sdt2), t in
[sdt2[:StartTime][i]:Dates.Minute(30):sdt2[:EndTime][i]]
if !(t in [sdt2[:BreakTime1][i], sdt2[:BreakTime2][i]])
push!(d1, [i, Dates.format(t, "HH:MM")])
end
end
MethodError: `convert` has no method matching convert(::Type{Int64},
::Array{Any,1})
This may have arisen from a call to the constructor Int64(...),
since type constructors fall back to convert methods.
Closest candidates are:
call{T}(::Type{T}, ::Any)
convert(::Type{Int64}, !Matched::Int8)
convert(::Type{Int64}, !Matched::UInt8)
Is there any way to correct this?
Thanks.
On Monday, May 30, 2016 at 9:22:24 PM UTC+5:30, Evan Fields wrote:
>
> I'm not 100% sure I understand your question, but let me give it a shot.
>
> First thing is to note why you're getting that MethodError. It's from the
> line
>
> println(si in sdt1[i, [:BreakTime1, :BreakTime2]])
>
> Define sdt1 as you do (I just copied into a Julia REPL) and set i = 1 to
> for the first iteration of the for loop.
>
> Then:
>
> julia> sdt1[i, [:BreakTime1, :BreakTime2]]
> 1×2 DataFrames.DataFrame
> │ Row │ BreakTime1 │ BreakTime2 │
> ├─┼─┼─┤
> │ 1 │ 2016-04-13T10:00:00 │ 2016-04-13T12:00:00 │
>
> julia> si =
> Dates.format([sdt1[i,:StartTime]:Dates.Minute(30):sdt1[i,:EndTime]],
> "HH:MM")
> WARNING: [a] concatenation is deprecated; use collect(a) instead
> in depwarn at deprecated.jl:73
> in oldstyle_vcat_warning at abstractarray.jl:29
> in vect at abstractarray.jl:32
> while loading no file, in expression starting on line 0
> 11-element Array{Any,1}:
> "07:15"
> "07:45"
> "08:15"
> "08:45"
> "09:15"
> "09:45"
> "10:15"
> "10:45"
> "11:15"
> "11:45"
> "12:15"
>
> julia> si in sdt1[i, [:BreakTime1, :BreakTime2]]
> ERROR: MethodError: `start` has no method matching
> start(::DataFrames.DataFrame)
> in mapreduce_sc_impl at reduce.jl:194
> in in at reduce.jl:377
>
> So si is of type Vector{Any} but happens to hold strings. sdt1[i,
> [:BreakTime1, :BreakTime2]] is a DataFrame. What does it mean to ask if a
> vector is in a DataFrame? That's what's happening in your println; the `in`
> is just an infix operator of function in.
>
> 3-element Array{Int64,1}:
> 1
> 2
> 3
>
> julia> 1 in x
> true
>
> julia> in(1,x)
> true
>
> julia> in(5,x)
> false
>
> I assume you get the MethodError of no method start because in(a,b)
> iterates over b, checking each element of b for equality to a. But
> DataFrames are not iterable in this way. (This part just a guess; look it
> up in the manual before telling your friends.)
>
> Anyway, to get output as from your R snippet, you could use a loop like
> the following:
>
> julia> for i in 1:nrow(sdt1), t in
> sdt1[:StartTime][i]:Dates.Minute(30):sdt1[:EndTime][i]
>if !(t in [sdt1[:BreakTime1][i], sdt1[:BreakTime2][i]])
>println("$i $(Dates.format(t, "HH:MM"))")
>end
>end
> 1 07:00
> 1 07:30
> 1 08:00
> 1 08:30
> 1 09:00
> 1 09:30
> 1 10:30
> 1 11:00
> 1 11:30
> 2 07:15
> 2 07:45
> 2 08:15
> 2 08:45
> 2 09:15
> 2 09:45
> 2 10:45
> 2 11:15
> 2 11:45
>
> I hope this helps!
>