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!
>

Reply via email to