Repository: jtablesaw/tablesaw
Pull request #281 (2018-04-18 20:58:59)

API for filling columns.
Thanks for contributing.

- [x ] Tick to sign-off your agreement to the [Developer Certificate of Origin (DCO) 1.1](https://developercertificate.org)

## Suggestion for and implementation of API for filling various column types with data.
Currently covered are columns for boolean, double, LocalDateTime, LocalDate and LocalTime.
All are based on the same API pattern, a filler interface that is implemented by the column, with fillWith methods for Iterators, Iterables and Suppliers. Default Iterables for ranges of each type (not boolean) is provided. The time-related columns also have static createWith methods for creating columns filled with a range, since these cannot be created with null as initial values.

## Testing

There are tests for each column type and range Iterable.


Patch:
diff --git a/core/src/examples/java/tech/tablesaw/TextExample.java b/core/src/examples/java/tech/tablesaw/TextExample.java
deleted file mode 100644
index ddbe4b88..00000000
--- a/core/src/examples/java/tech/tablesaw/TextExample.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package tech.tablesaw;
-
-import tech.tablesaw.api.NumberColumn;
-import tech.tablesaw.api.StringColumn;
-
-/**
- * Usage example using a Tornado data set
- */
-public class TextExample extends AbstractExample {
-
-    private static final String[] words1 = {"one", "two words"};
-    private static final StringColumn stringColumn1 = StringColumn.create("words", words1);
-
-    public static void main(String[] args) throws Exception {
-        countWords(stringColumn1);
-    }
-
-    private static void countWords(StringColumn sc) {
-        NumberColumn nc = sc.countTokens(" ");
-        out("Word count: " + nc.sum());
-    }
-}
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/aggregate/AggregateFunctions.java b/core/src/main/java/tech/tablesaw/aggregate/AggregateFunctions.java
index f8835998..cff4e1d4 100644
--- a/core/src/main/java/tech/tablesaw/aggregate/AggregateFunctions.java
+++ b/core/src/main/java/tech/tablesaw/aggregate/AggregateFunctions.java
@@ -79,11 +79,6 @@ public class AggregateFunctions {
         }
     };
 
-    /**
-     * A function that calculates the count of values in the column excluding missing values. A synonym for countNonMissing
-     */
-    public static AggregateFunction count = countNonMissing;
-
     /**
      * A function that calculates the count of values in the column excluding missing values
      */
@@ -301,8 +296,7 @@ public class AggregateFunctions {
 
         @Override
         public double summarize(Column column) {
-            double[] values = removeMissing((NumberColumn) column);
-            return StatUtils.variance(values);
+            return StatUtils.variance(removeMissing((NumberColumn) column));
         }
     };
 
@@ -331,7 +325,7 @@ public class AggregateFunctions {
     }
 
     private static double[] removeMissing(NumberColumn column) {
-        return column.removeMissing().asDoubleArray();
+        return removeMissing(column.asDoubleArray());
     }
 
     private static Column removeMissing(Column column) {
diff --git a/core/src/main/java/tech/tablesaw/aggregate/Summarizer.java b/core/src/main/java/tech/tablesaw/aggregate/Summarizer.java
index 9dabe49f..475e16af 100644
--- a/core/src/main/java/tech/tablesaw/aggregate/Summarizer.java
+++ b/core/src/main/java/tech/tablesaw/aggregate/Summarizer.java
@@ -38,7 +38,6 @@ import java.util.List;
 public class Summarizer {
 
     private final Table original;
-    private final Table temp;
     private final List<String> summarizedColumns = new ArrayList<>();
     private final AggregateFunction[] reductions;
 
@@ -47,9 +46,6 @@ public class Summarizer {
      * by applying the given functions
      */
     public Summarizer(Table sourceTable, Column column, AggregateFunction... functions) {
-        Table tempTable = Table.create(sourceTable.name());
-        tempTable.addColumn(column);
-        this.temp = tempTable;
         this.original = sourceTable;
         summarizedColumns.add(column.name());
         this.reductions = functions;
@@ -60,11 +56,6 @@ public class Summarizer {
      * by applying the given functions
      */
     public Summarizer(Table sourceTable, List<String> columnNames, AggregateFunction... functions) {
-        Table tempTable = Table.create(sourceTable.name());
-        for (String nm : columnNames) {
-            tempTable.addColumn(sourceTable.column(nm));
-        }
-        this.temp = tempTable;
         this.original = sourceTable;
         summarizedColumns.addAll(columnNames);
         this.reductions = functions;
@@ -75,10 +66,6 @@ public class Summarizer {
      * by applying the given functions
      */
     public Summarizer(Table sourceTable, Column column1, Column column2, AggregateFunction... functions) {
-        Table tempTable = Table.create(sourceTable.name());
-        tempTable.addColumn(column1);
-        tempTable.addColumn(column2);
-        this.temp = tempTable;
         this.original = sourceTable;
         summarizedColumns.add(column1.name());
         summarizedColumns.add(column2.name());
@@ -95,12 +82,6 @@ public class Summarizer {
                       Column column3,
                       Column column4,
                       AggregateFunction... functions) {
-        Table tempTable = Table.create(sourceTable.name());
-        tempTable.addColumn(column1);
-        tempTable.addColumn(column2);
-        tempTable.addColumn(column3);
-        tempTable.addColumn(column4);
-        this.temp = tempTable;
         this.original = sourceTable;
         summarizedColumns.add(column1.name());
         summarizedColumns.add(column2.name());
@@ -114,11 +95,6 @@ public class Summarizer {
      * by applying the given functions
      */
     public Summarizer(Table sourceTable, Column column1, Column column2, Column column3, AggregateFunction... functions) {
-        Table tempTable = Table.create(sourceTable.name());
-        tempTable.addColumn(column1);
-        tempTable.addColumn(column2);
-        tempTable.addColumn(column3);
-        this.temp = tempTable;
         this.original = sourceTable;
         summarizedColumns.add(column1.name());
         summarizedColumns.add(column2.name());
@@ -127,27 +103,17 @@ public class Summarizer {
     }
 
     public Table by(String... columnNames) {
-        for (String columnName : columnNames) {
-            if (!temp.columnNames().contains(columnName)) {
-                temp.addColumn(original.column(columnName));
-            }
-        }
-        TableSliceGroup group = StandardTableSliceGroup.create(temp, columnNames);
+        TableSliceGroup group = StandardTableSliceGroup.create(original, columnNames);
         return summarize(group);
     }
 
     public Table by(CategoricalColumn... columns) {
-        for (Column c : columns) {
-            if (!temp.containsColumn(c)) {
-                temp.addColumn(c);
-            }
-        }
-        TableSliceGroup group = StandardTableSliceGroup.create(temp, columns);
+        TableSliceGroup group = StandardTableSliceGroup.create(original, columns);
         return summarize(group);
     }
 
     public Table by(String groupNameTemplate, int step) {
-        TableSliceGroup group = SelectionTableSliceGroup.create(temp, groupNameTemplate, step);
+        TableSliceGroup group = SelectionTableSliceGroup.create(original, groupNameTemplate, step);
         return summarize(group);
     }
 
@@ -156,13 +122,22 @@ public class Summarizer {
      */
     public Table apply() {
         List<Table> results = new ArrayList<>();
-        ArrayListMultimap<String, AggregateFunction> reductionMultimap = getAggregateFunctionMultimap();
+        ArrayListMultimap<String, AggregateFunction> reductionMultimap = ArrayListMultimap.create();
+        for (String name: summarizedColumns) {
+            Column column = original.column(name);
+            ColumnType type = column.type();
+            for (AggregateFunction reduction : reductions) {
+                if (reduction.isCompatibleWith(type)) {
+                    reductionMultimap.put(name, reduction);
+                }
+            }
+        }
 
         for (String name : reductionMultimap.keys()) {
             List<AggregateFunction> reductions = reductionMultimap.get(name);
-            Table table = TableSliceGroup.summaryTableName(temp);
+            Table table = TableSliceGroup.summaryTableName(original);
             for (AggregateFunction function : reductions) {
-                Column column = temp.column(name);
+                Column column = original.column(name);
                 double result = function.summarize(column);
                 Column newColumn = DoubleColumn.create(TableSliceGroup.aggregateColumnName(name, function.functionName()));
                 ((DoubleColumn) newColumn).append(result);
@@ -181,19 +156,9 @@ public class Summarizer {
     private Table summarize(TableSliceGroup group) {
         List<Table> results = new ArrayList<>();
 
-        ArrayListMultimap<String, AggregateFunction> reductionMultimap = getAggregateFunctionMultimap();
-
-        for (String name : reductionMultimap.keys()) {
-            List<AggregateFunction> reductions = reductionMultimap.get(name);
-            results.add(group.aggregate(name, reductions.toArray(new AggregateFunction[0])));
-        }
-        return combineTables(results);
-    }
-
-    private ArrayListMultimap<String, AggregateFunction> getAggregateFunctionMultimap() {
         ArrayListMultimap<String, AggregateFunction> reductionMultimap = ArrayListMultimap.create();
         for (String name: summarizedColumns) {
-            Column column = temp.column(name);
+            Column column = original.column(name);
             ColumnType type = column.type();
             for (AggregateFunction reduction : reductions) {
                 if (reduction.isCompatibleWith(type)) {
@@ -201,7 +166,12 @@ public class Summarizer {
                 }
             }
         }
-        return reductionMultimap;
+
+        for (String name : reductionMultimap.keys()) {
+            List<AggregateFunction> reductions = reductionMultimap.get(name);
+            results.add(group.aggregate(name, reductions.toArray(new AggregateFunction[reductions.size()])));
+        }
+        return combineTables(results);
     }
 
     private Table combineTables(List<Table> tables) {
diff --git a/core/src/main/java/tech/tablesaw/api/BooleanColumn.java b/core/src/main/java/tech/tablesaw/api/BooleanColumn.java
index 84bf328f..d57f1814 100644
--- a/core/src/main/java/tech/tablesaw/api/BooleanColumn.java
+++ b/core/src/main/java/tech/tablesaw/api/BooleanColumn.java
@@ -14,7 +14,20 @@
 
 package tech.tablesaw.api;
 
+import static com.google.common.base.Preconditions.checkArgument;
+import static tech.tablesaw.api.ColumnType.BOOLEAN;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.BiPredicate;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+
 import com.google.common.base.Strings;
+
+import it.unimi.dsi.fastutil.booleans.BooleanIterable;
+import it.unimi.dsi.fastutil.booleans.BooleanIterator;
 import it.unimi.dsi.fastutil.booleans.BooleanOpenHashSet;
 import it.unimi.dsi.fastutil.booleans.BooleanSet;
 import it.unimi.dsi.fastutil.bytes.Byte2IntMap;
@@ -30,6 +43,7 @@ import it.unimi.dsi.fastutil.ints.IntComparator;
 import tech.tablesaw.columns.AbstractColumn;
 import tech.tablesaw.columns.Column;
 import tech.tablesaw.columns.booleans.BooleanColumnUtils;
+import tech.tablesaw.columns.booleans.BooleanFillers;
 import tech.tablesaw.columns.booleans.BooleanFormatter;
 import tech.tablesaw.columns.booleans.BooleanMapUtils;
 import tech.tablesaw.filtering.predicates.BytePredicate;
@@ -37,20 +51,10 @@ import tech.tablesaw.io.TypeUtils;
 import tech.tablesaw.selection.BitmapBackedSelection;
 import tech.tablesaw.selection.Selection;
 
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.function.BiPredicate;
-import java.util.function.Predicate;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static tech.tablesaw.api.ColumnType.BOOLEAN;
-
 /**
  * A column in a base table that contains float values
  */
-public class BooleanColumn extends AbstractColumn implements BooleanMapUtils, IntConvertibleColumn {
+public class BooleanColumn extends AbstractColumn implements BooleanMapUtils, IntConvertibleColumn, BooleanFillers<BooleanColumn>, BooleanIterable {
 
     public static final byte MISSING_VALUE = (Byte) BOOLEAN.getMissingValue();
 
@@ -222,16 +226,15 @@ public class BooleanColumn extends AbstractColumn implements BooleanMapUtils, In
         return BOOLEAN;
     }
 
-    public BooleanColumn append(boolean b) {
+    public void append(boolean b) {
         if (b) {
             data.add(BYTE_TRUE);
         } else {
             data.add(BYTE_FALSE);
         }
-        return this;
     }
 
-    public BooleanColumn append(Boolean b) {
+    public void append(Boolean b) {
         if (b == null) {
             data.add(MISSING_VALUE);
         }
@@ -240,18 +243,15 @@ public class BooleanColumn extends AbstractColumn implements BooleanMapUtils, In
         } else {
             data.add(BYTE_FALSE);
         }
-        return this;
     }
 
-    public BooleanColumn append(byte b) {
+    public void append(byte b) {
         data.add(b);
-        return this;
     }
 
     @Override
-    public BooleanColumn appendMissing() {
+    public void appendMissing() {
         append(MISSING_VALUE);
-        return this;
     }
 
     @Override
@@ -281,7 +281,7 @@ public class BooleanColumn extends AbstractColumn implements BooleanMapUtils, In
 
     @Override
     public BooleanColumn copy() {
-        return new BooleanColumn(name(), data.clone());
+        return new BooleanColumn(name(), data);
     }
 
     @Override
@@ -294,9 +294,8 @@ public class BooleanColumn extends AbstractColumn implements BooleanMapUtils, In
         ByteArrays.mergeSort(data.elements(), descendingByteComparator);
     }
 
-    public BooleanColumn appendCell(String object) {
+    public void appendCell(String object) {
         append(convert(object));
-        return this;
     }
 
     /**
@@ -432,13 +431,12 @@ public class BooleanColumn extends AbstractColumn implements BooleanMapUtils, In
         return data;
     }
 
-    public BooleanColumn set(int i, boolean b) {
+    public void set(int i, boolean b) {
         if (b) {
             data.set(i, BYTE_TRUE);
         } else {
             data.set(i, BYTE_FALSE);
         }
-        return this;
     }
 
     public BooleanColumn lead(int n) {
@@ -469,11 +467,10 @@ public class BooleanColumn extends AbstractColumn implements BooleanMapUtils, In
      * Conditionally update this column, replacing current values with newValue for all rows where the current value
      * matches the selection criteria
      **/
-    public BooleanColumn set(boolean newValue, Selection rowSelection) {
+    public void set(boolean newValue, Selection rowSelection) {
         for (int row : rowSelection) {
             set(row, newValue);
         }
-        return this;
     }
 
     @Override
@@ -525,7 +522,7 @@ public class BooleanColumn extends AbstractColumn implements BooleanMapUtils, In
         return eval(BooleanColumnUtils.isNotMissing);
     }
 
-    public Iterator<Boolean> iterator() {
+    public BooleanIterator iterator() {
         return new BooleanColumnIterator(this.byteIterator());
     }
 
@@ -647,7 +644,7 @@ public class BooleanColumn extends AbstractColumn implements BooleanMapUtils, In
         return Objects.hash(data);
     }
 
-    private static class BooleanColumnIterator implements Iterator<Boolean> {
+    private static class BooleanColumnIterator implements BooleanIterator {
 
         final ByteIterator iterator;
 
@@ -674,7 +671,7 @@ public class BooleanColumn extends AbstractColumn implements BooleanMapUtils, In
          * @throws java.util.NoSuchElementException if the iteration has no more elements
          */
         @Override
-        public Boolean next() {
+        public boolean nextBoolean() {
             byte b = iterator.nextByte();
             if (b == (byte) 0) {
                 return false;
@@ -682,7 +679,47 @@ public class BooleanColumn extends AbstractColumn implements BooleanMapUtils, In
             if (b == (byte) 1) {
                 return true;
             }
-            return null;
+            return false;
+        }
+    }
+
+    // fillWith methods
+
+    @Override
+    public BooleanColumn fillWith(BooleanIterator iterator) {
+        for (int r = 0; r < size(); r++) {
+            if (!iterator.hasNext()) {
+                break;
+            }
+            set(r, iterator.nextBoolean());
+        }
+        return this;
+    }
+
+    @Override
+    public BooleanColumn fillWith(BooleanIterable iterable) {
+        BooleanIterator iterator = null;
+        for (int r = 0; r < size(); r++) {
+            if (iterator == null || (!iterator.hasNext())) {
+                iterator = iterable.iterator();
+                if (!iterator.hasNext()) {
+                    break;
+                }
+            }
+            set(r, iterator.nextBoolean());
         }
+        return this;
+    }
+
+    @Override
+    public BooleanColumn fillWith(Supplier<Boolean> supplier) {
+        for (int r = 0; r < size(); r++) {
+            try {
+                set(r, supplier.get());
+            } catch (Exception e) {
+                break;
+            }
+        }
+        return this;
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/api/ColumnType.java b/core/src/main/java/tech/tablesaw/api/ColumnType.java
index b6ee4755..6c4bcfb0 100644
--- a/core/src/main/java/tech/tablesaw/api/ColumnType.java
+++ b/core/src/main/java/tech/tablesaw/api/ColumnType.java
@@ -44,14 +44,14 @@ public enum ColumnType {
 
     public Column create(String name) {
         switch (this) {
-            case BOOLEAN: return BooleanColumn.create(name);
-            case STRING: return StringColumn.create(name);
-            case NUMBER: return DoubleColumn.create(name);
-            case LOCAL_DATE: return DateColumn.create(name);
-            case LOCAL_DATE_TIME: return DateTimeColumn.create(name);
-            case LOCAL_TIME: return TimeColumn.create(name);
+            case BOOLEAN: return BooleanColumn.create("name");
+            case STRING: return StringColumn.create("name");
+            case NUMBER: return DoubleColumn.create("name");
+            case LOCAL_DATE: return DateColumn.create("name");
+            case LOCAL_DATE_TIME: return DateTimeColumn.create("name");
+            case LOCAL_TIME: return TimeColumn.create("name");
         }
-        throw new UnsupportedOperationException("Column type " + this.name() + " doesn't support column creation");
+        throw new UnsupportedOperationException("Column type " + this.name() + " doesn't support column cration");
     }
 
     public Comparable<?> getMissingValue() {
diff --git a/core/src/main/java/tech/tablesaw/api/DateColumn.java b/core/src/main/java/tech/tablesaw/api/DateColumn.java
index 765aa47e..878806b3 100644
--- a/core/src/main/java/tech/tablesaw/api/DateColumn.java
+++ b/core/src/main/java/tech/tablesaw/api/DateColumn.java
@@ -14,8 +14,26 @@
 
 package tech.tablesaw.api;
 
+import java.nio.ByteBuffer;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import java.util.function.BiPredicate;
+import java.util.function.Consumer;
+import java.util.function.IntPredicate;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
+
 import it.unimi.dsi.fastutil.ints.IntArrayList;
 import it.unimi.dsi.fastutil.ints.IntArrays;
 import it.unimi.dsi.fastutil.ints.IntComparator;
@@ -25,6 +43,7 @@ import it.unimi.dsi.fastutil.ints.IntSet;
 import tech.tablesaw.columns.AbstractColumn;
 import tech.tablesaw.columns.Column;
 import tech.tablesaw.columns.dates.DateColumnFormatter;
+import tech.tablesaw.columns.dates.DateFillers;
 import tech.tablesaw.columns.dates.DateFilters;
 import tech.tablesaw.columns.dates.DateMapFunctions;
 import tech.tablesaw.columns.dates.PackedLocalDate;
@@ -34,26 +53,11 @@ import tech.tablesaw.selection.BitmapBackedSelection;
 import tech.tablesaw.selection.Selection;
 import tech.tablesaw.sorting.comparators.DescendingIntComparator;
 
-import java.nio.ByteBuffer;
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.time.format.DateTimeParseException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import java.util.function.BiPredicate;
-import java.util.function.IntPredicate;
-import java.util.function.Predicate;
-
 /**
  * A column in a base table that contains float values
  */
-public class DateColumn extends AbstractColumn implements DateFilters,
-        DateMapFunctions, CategoricalColumn, Iterable<LocalDate> {
+public class DateColumn extends AbstractColumn implements DateFilters, DateFillers<DateColumn>,
+DateMapFunctions, CategoricalColumn, Iterable<LocalDate> {
 
     public static final int MISSING_VALUE = (Integer) ColumnType.LOCAL_DATE.getMissingValue();
 
@@ -127,9 +131,8 @@ public class DateColumn extends AbstractColumn implements DateFilters,
         return ColumnType.LOCAL_DATE;
     }
 
-    public DateColumn appendInternal(int f) {
+    public void appendInternal(int f) {
         data.add(f);
-        return this;
     }
 
     @Override
@@ -137,19 +140,16 @@ public class DateColumn extends AbstractColumn implements DateFilters,
         return data;
     }
 
-    public DateColumn set(int index, int value) {
+    public void set(int index, int value) {
         data.set(index, value);
-        return this;
     }
 
-    public DateColumn set(int index, LocalDate value) {
+    public void set(int index, LocalDate value) {
         data.set(index, PackedLocalDate.pack(value));
-        return this;
     }
 
-    public DateColumn append(LocalDate f) {
+    public void append(LocalDate f) {
         appendInternal(PackedLocalDate.pack(f));
-        return this;
     }
 
     public void setPrintFormatter(DateTimeFormatter dateTimeFormatter, String missingValueString) {
@@ -310,18 +310,16 @@ public class DateColumn extends AbstractColumn implements DateFilters,
      * Example:
      * myColumn.set(LocalDate.now(), myColumn.valueIsMissing()); // no more missing values
      */
-    public DateColumn set(LocalDate newValue, Selection rowSelection) {
+    public void set(LocalDate newValue, Selection rowSelection) {
         int packed = PackedLocalDate.pack(newValue);
         for (int row : rowSelection) {
             set(row, packed);
         }
-        return this;
     }
 
     @Override
-    public DateColumn appendMissing() {
+    public void appendMissing() {
         appendInternal(MISSING_VALUE);
-        return this;
     }
 
     public LocalDate get(int index) {
@@ -364,9 +362,8 @@ public class DateColumn extends AbstractColumn implements DateFilters,
     }
 
     @Override
-    public DateColumn appendCell(String string) {
+    public void appendCell(String string) {
         appendInternal(convert(string));
-        return this;
     }
 
     @Override
@@ -627,4 +624,80 @@ public class DateColumn extends AbstractColumn implements DateFilters,
             }
         };
     }
-}
\ No newline at end of file
+
+    // fillWith methods
+
+    private DateColumn fillWith(int count, Iterator<LocalDate> iterator, Consumer<LocalDate> acceptor) {
+        for (int r = 0; r < count; r++) {
+            if (!iterator.hasNext()) {
+                break;
+            }
+            acceptor.accept(iterator.next());
+        }
+        return this;
+    }
+
+    @Override
+    public DateColumn fillWith(Iterator<LocalDate> iterator) {
+        int[] r = new int[1];
+        fillWith(size(), iterator, date -> set(r[0]++, date));
+        return this;
+    }
+
+    public static DateColumn createWith(String name, int size, Iterator<LocalDate> iterator) {
+        DateColumn column = new DateColumn(name, new IntArrayList(size), Locale.getDefault());
+        column.fillWith(size, iterator, column::append);
+        return column;
+    }
+
+    private DateColumn fillWith(int count, Iterable<LocalDate> iterable, Consumer<LocalDate> acceptor) {
+        Iterator<LocalDate> iterator = null;
+        for (int r = 0; r < count; r++) {
+            if (iterator == null || (!iterator.hasNext())) {
+                iterator = iterable.iterator();
+                if (!iterator.hasNext()) {
+                    break;
+                }
+            }
+            acceptor.accept(iterator.next());
+        }
+        return this;
+    }
+
+    @Override
+    public DateColumn fillWith(Iterable<LocalDate> iterable) {
+        int[] r = new int[1];
+        fillWith(size(), iterable, date -> set(r[0]++, date));
+        return this;
+    }
+
+    public static DateColumn createWith(String name, int size, Iterable<LocalDate> iterable) {
+        DateColumn column = new DateColumn(name, new IntArrayList(size), Locale.getDefault());
+        column.fillWith(size, iterable, column::append);
+        return column;
+    }
+
+    private DateColumn fillWith(int count, Supplier<LocalDate> supplier, Consumer<LocalDate> acceptor) {
+        for (int r = 0; r < count; r++) {
+            try {
+                acceptor.accept(supplier.get());
+            } catch (Exception e) {
+                break;
+            }
+        }
+        return this;
+    }
+
+    @Override
+    public DateColumn fillWith(Supplier<LocalDate> supplier) {
+        int[] r = new int[1];
+        fillWith(size(), supplier, date -> set(r[0]++, date));
+        return this;
+    }
+
+    public static DateColumn createWith(String name, int size, Supplier<LocalDate> supplier) {
+        DateColumn column = new DateColumn(name, new IntArrayList(size), Locale.getDefault());
+        column.fillWith(size, supplier, column::append);
+        return column;
+    }
+}
diff --git a/core/src/main/java/tech/tablesaw/api/DateTimeColumn.java b/core/src/main/java/tech/tablesaw/api/DateTimeColumn.java
index 6c349c3f..150ed990 100644
--- a/core/src/main/java/tech/tablesaw/api/DateTimeColumn.java
+++ b/core/src/main/java/tech/tablesaw/api/DateTimeColumn.java
@@ -14,8 +14,26 @@
 
 package tech.tablesaw.api;
 
+import static tech.tablesaw.api.ColumnType.LOCAL_DATE_TIME;
+
+import java.nio.ByteBuffer;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
+
 import it.unimi.dsi.fastutil.ints.IntComparator;
 import it.unimi.dsi.fastutil.longs.LongArrayList;
 import it.unimi.dsi.fastutil.longs.LongArrays;
@@ -26,6 +44,7 @@ import it.unimi.dsi.fastutil.longs.LongSet;
 import tech.tablesaw.columns.AbstractColumn;
 import tech.tablesaw.columns.Column;
 import tech.tablesaw.columns.datetimes.DateTimeColumnFormatter;
+import tech.tablesaw.columns.datetimes.DateTimeFillers;
 import tech.tablesaw.columns.datetimes.DateTimeFilters;
 import tech.tablesaw.columns.datetimes.DateTimeMapFunctions;
 import tech.tablesaw.columns.datetimes.PackedLocalDateTime;
@@ -33,26 +52,11 @@ import tech.tablesaw.io.TypeUtils;
 import tech.tablesaw.selection.Selection;
 import tech.tablesaw.sorting.comparators.DescendingLongComparator;
 
-import java.nio.ByteBuffer;
-import java.time.LocalDateTime;
-import java.time.ZoneOffset;
-import java.time.format.DateTimeFormatter;
-import java.time.format.DateTimeParseException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-
-import static tech.tablesaw.api.ColumnType.LOCAL_DATE_TIME;
-
 /**
  * A column in a table that contains long-integer encoded (packed) local date-time values
  */
 public class DateTimeColumn extends AbstractColumn
-        implements DateTimeMapFunctions, DateTimeFilters, Iterable<LocalDateTime> {
+implements DateTimeMapFunctions, DateTimeFilters, DateTimeFillers<DateTimeColumn>, Iterable<LocalDateTime> {
 
     public static final long MISSING_VALUE = (Long) ColumnType.LOCAL_DATE_TIME.getMissingValue();
 
@@ -177,24 +181,22 @@ public class DateTimeColumn extends AbstractColumn
     }
 
     @Override
-    public DateTimeColumn appendCell(String stringValue) {
+    public void appendCell(String stringValue) {
         if (stringValue == null) {
             appendInternal(MISSING_VALUE);
         } else {
             long dateTime = convert(stringValue);
             appendInternal(dateTime);
         }
-        return this;
     }
 
-    public DateTimeColumn append(LocalDateTime dateTime) {
+    public void append(LocalDateTime dateTime) {
         if (dateTime != null) {
             final long dt = PackedLocalDateTime.pack(dateTime);
             appendInternal(dt);
         } else {
             appendInternal(MISSING_VALUE);
         }
-        return this;
     }
 
     /**
@@ -230,9 +232,8 @@ public class DateTimeColumn extends AbstractColumn
         return LOCAL_DATE_TIME;
     }
 
-    public DateTimeColumn appendInternal(long dateTime) {
+    public void appendInternal(long dateTime) {
         data.add(dateTime);
-        return this;
     }
 
     @Override
@@ -353,11 +354,10 @@ public class DateTimeColumn extends AbstractColumn
      * Example:
      * myColumn.set(LocalDateTime.now(), myColumn.valueIsMissing()); // no more missing values
      */
-    public DateTimeColumn set(LocalDateTime newValue, Selection rowSelection) {
+    public void set(LocalDateTime newValue, Selection rowSelection) {
         for (int row : rowSelection) {
             set(row, newValue);
         }
-        return this;
     }
 
     /**
@@ -435,9 +435,8 @@ public class DateTimeColumn extends AbstractColumn
     }
 
     @Override
-    public DateTimeColumn appendMissing() {
+    public void appendMissing() {
         appendInternal(MISSING_VALUE);
-        return this;
     }
 
     public LocalDateTime min() {
@@ -459,14 +458,12 @@ public class DateTimeColumn extends AbstractColumn
         return PackedLocalDateTime.asLocalDateTime(min);
     }
 
-    public DateTimeColumn set(int index, long value) {
+    public void set(int index, long value) {
         data.set(index, value);
-        return this;
     }
 
-    public DateTimeColumn set(int index, LocalDateTime value) {
+    public void set(int index, LocalDateTime value) {
         data.set(index, PackedLocalDateTime.pack(value));
-        return this;
     }
 
     /**
@@ -565,4 +562,80 @@ public class DateTimeColumn extends AbstractColumn
             }
         };
     }
+
+    // fillWith methods
+
+    private DateTimeColumn fillWith(int count, Iterator<LocalDateTime> iterator, Consumer<LocalDateTime> acceptor) {
+        for (int r = 0; r < count; r++) {
+            if (!iterator.hasNext()) {
+                break;
+            }
+            acceptor.accept(iterator.next());
+        }
+        return this;
+    }
+
+    @Override
+    public DateTimeColumn fillWith(Iterator<LocalDateTime> iterator) {
+        int[] r = new int[1];
+        fillWith(size(), iterator, date -> set(r[0]++, date));
+        return this;
+    }
+
+    public static DateTimeColumn createWith(String name, int size, Iterator<LocalDateTime> iterator) {
+        DateTimeColumn column = create(name, size, Locale.getDefault());
+        column.fillWith(size, iterator, column::append);
+        return column;
+    }
+
+    private DateTimeColumn fillWith(int count, Iterable<LocalDateTime> iterable, Consumer<LocalDateTime> acceptor) {
+        Iterator<LocalDateTime> iterator = null;
+        for (int r = 0; r < count; r++) {
+            if (iterator == null || (!iterator.hasNext())) {
+                iterator = iterable.iterator();
+                if (!iterator.hasNext()) {
+                    break;
+                }
+            }
+            acceptor.accept(iterator.next());
+        }
+        return this;
+    }
+
+    @Override
+    public DateTimeColumn fillWith(Iterable<LocalDateTime> iterable) {
+        int[] r = new int[1];
+        fillWith(size(), iterable, date -> set(r[0]++, date));
+        return this;
+    }
+
+    public static DateTimeColumn createWith(String name, int size, Iterable<LocalDateTime> iterable) {
+        DateTimeColumn column = create(name, size, Locale.getDefault());
+        column.fillWith(size, iterable, column::append);
+        return column;
+    }
+
+    private DateTimeColumn fillWith(int count, Supplier<LocalDateTime> supplier, Consumer<LocalDateTime> acceptor) {
+        for (int r = 0; r < count; r++) {
+            try {
+                acceptor.accept(supplier.get());
+            } catch (Exception e) {
+                break;
+            }
+        }
+        return this;
+    }
+
+    @Override
+    public DateTimeColumn fillWith(Supplier<LocalDateTime> supplier) {
+        int[] r = new int[1];
+        fillWith(size(), supplier, date -> set(r[0]++, date));
+        return this;
+    }
+
+    public static DateTimeColumn createWith(String name, int size, Supplier<LocalDateTime> supplier) {
+        DateTimeColumn column = create(name, size, Locale.getDefault());
+        column.fillWith(size, supplier, column::append);
+        return column;
+    }
 }
diff --git a/core/src/main/java/tech/tablesaw/api/DoubleColumn.java b/core/src/main/java/tech/tablesaw/api/DoubleColumn.java
index f32c9942..4fb55b85 100644
--- a/core/src/main/java/tech/tablesaw/api/DoubleColumn.java
+++ b/core/src/main/java/tech/tablesaw/api/DoubleColumn.java
@@ -14,11 +14,27 @@
 
 package tech.tablesaw.api;
 
+import static tech.tablesaw.api.ColumnType.NUMBER;
+
+import java.nio.ByteBuffer;
+import java.text.NumberFormat;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+import java.util.function.BiPredicate;
+import java.util.function.DoubleConsumer;
+import java.util.function.DoublePredicate;
+import java.util.function.DoubleSupplier;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
+
 import it.unimi.dsi.fastutil.doubles.DoubleArrayList;
 import it.unimi.dsi.fastutil.doubles.DoubleArrays;
 import it.unimi.dsi.fastutil.doubles.DoubleComparator;
+import it.unimi.dsi.fastutil.doubles.DoubleIterable;
 import it.unimi.dsi.fastutil.doubles.DoubleIterator;
 import it.unimi.dsi.fastutil.doubles.DoubleList;
 import it.unimi.dsi.fastutil.doubles.DoubleOpenHashSet;
@@ -38,19 +54,6 @@ import tech.tablesaw.io.TypeUtils;
 import tech.tablesaw.selection.BitmapBackedSelection;
 import tech.tablesaw.selection.Selection;
 
-import java.nio.ByteBuffer;
-import java.text.NumberFormat;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Locale;
-import java.util.function.BiPredicate;
-import java.util.function.DoubleConsumer;
-import java.util.function.DoublePredicate;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import static tech.tablesaw.api.ColumnType.NUMBER;
-
 /**
  * A column in a base table that contains double precision floating point values
  */
@@ -70,55 +73,56 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
 
     private final IntComparator comparator = new IntComparator() {
 
-        public int compare(int r1, int r2) {
-            double f1 = data.getDouble(r1);
-            double f2 = data.getDouble(r2);
+        @Override
+        public int compare(final int r1, final int r2) {
+            final double f1 = data.getDouble(r1);
+            final double f2 = data.getDouble(r2);
             return Double.compare(f1, f2);
         }
     };
 
-    public static DoubleColumn create(String name, int initialSize) {
+    public static DoubleColumn create(final String name, final int initialSize) {
         return new DoubleColumn(name, new DoubleArrayList(initialSize));
     }
 
-    public static DoubleColumn create(String name, double[] arr) {
+    public static DoubleColumn create(final String name, final double[] arr) {
         return new DoubleColumn(name, new DoubleArrayList(arr));
     }
 
-    public static DoubleColumn create(String name, float[] arr) {
-        double[] doubles = new double[arr.length];
+    public static DoubleColumn create(final String name, final float[] arr) {
+        final double[] doubles = new double[arr.length];
         for (int i = 0; i < arr.length; i++) {
             doubles[i] = arr[i];
         }
         return new DoubleColumn(name, new DoubleArrayList(doubles));
     }
 
-    public static DoubleColumn create(String name, int[] arr) {
-        double[] doubles = new double[arr.length];
+    public static DoubleColumn create(final String name, final int[] arr) {
+        final double[] doubles = new double[arr.length];
         for (int i = 0; i < arr.length; i++) {
             doubles[i] = arr[i];
         }
         return new DoubleColumn(name, new DoubleArrayList(doubles));
     }
 
-    public static DoubleColumn create(String name, long[] arr) {
-        double[] doubles = new double[arr.length];
+    public static DoubleColumn create(final String name, final long[] arr) {
+        final double[] doubles = new double[arr.length];
         for (int i = 0; i < arr.length; i++) {
             doubles[i] = arr[i];
         }
         return new DoubleColumn(name, new DoubleArrayList(doubles));
     }
 
-    public static DoubleColumn create(String name, List<Number> numberList) {
-        double[] doubles = new double[numberList.size()];
+    public static DoubleColumn create(final String name, final List<Number> numberList) {
+        final double[] doubles = new double[numberList.size()];
         for (int i = 0; i < numberList.size(); i++) {
             doubles[i] = numberList.get(i).doubleValue();
         }
         return new DoubleColumn(name, new DoubleArrayList(doubles));
     }
 
-    public static DoubleColumn create(String name, Number[] numbers) {
-        double[] doubles = new double[numbers.length];
+    public static DoubleColumn create(final String name, final Number[] numbers) {
+        final double[] doubles = new double[numbers.length];
         for (int i = 0; i < numbers.length; i++) {
             doubles[i] = numbers[i].doubleValue();
         }
@@ -130,20 +134,20 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
      * <p>
      * We remove any commas before parsing
      */
-    public static double convert(String stringValue) {
+    public static double convert(final String stringValue) {
         if (Strings.isNullOrEmpty(stringValue) || TypeUtils.MISSING_INDICATORS.contains(stringValue)) {
             return MISSING_VALUE;
         }
-        Matcher matcher = DoubleColumn.COMMA_PATTERN.matcher(stringValue);
+        final Matcher matcher = DoubleColumn.COMMA_PATTERN.matcher(stringValue);
         return Double.parseDouble(matcher.replaceAll(""));
     }
 
     @Override
     public DoubleColumn removeMissing() {
-        DoubleColumn noMissing = (DoubleColumn) emptyCopy();
-        DoubleIterator iterator = iterator();
+        final DoubleColumn noMissing = (DoubleColumn) emptyCopy();
+        final DoubleIterator iterator = iterator();
         while(iterator.hasNext()) {
-            double v = iterator.nextDouble();
+            final double v = iterator.nextDouble();
             if (!NumberColumn.valueIsMissing(v)) {
                 noMissing.append(v);
             }
@@ -156,8 +160,8 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
      * integers beginning at startsWith and continuing through size (exclusive), monotonically increasing by 1
      * TODO consider a generic fill function including steps or random samples from various distributions
      */
-    public static DoubleColumn indexColumn(String columnName, int size, int startsWith) {
-        DoubleColumn indexColumn = DoubleColumn.create(columnName, size);
+    public static DoubleColumn indexColumn(final String columnName, final int size, final int startsWith) {
+        final DoubleColumn indexColumn = DoubleColumn.create(columnName, size);
         for (int i = 0; i < size; i++) {
             indexColumn.append(i + startsWith);
         }
@@ -165,32 +169,31 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
         return indexColumn;
     }
 
-    public static DoubleColumn create(String columnName) {
+    public static DoubleColumn create(final String columnName) {
         return create(columnName, DEFAULT_ARRAY_SIZE);
     }
 
     @Override
-    public boolean isMissing(int rowNumber) {
+    public boolean isMissing(final int rowNumber) {
         return NumberColumn.valueIsMissing(get(rowNumber));
     }
 
     @Override
-    public void setPrintFormatter(NumberFormat format, String missingValueString) {
+    public void setPrintFormatter(final NumberFormat format, final String missingValueString) {
         this.printFormatter = new NumberColumnFormatter(format, missingValueString);
     }
 
     @Override
-    public DoubleColumn appendMissing() {
+    public void appendMissing() {
         append(MISSING_VALUE);
-        return this;
     }
 
     @Override
-    public void setPrintFormatter(NumberColumnFormatter formatter) {
+    public void setPrintFormatter(final NumberColumnFormatter formatter) {
         this.printFormatter = formatter;
     }
 
-    private DoubleColumn(String name, DoubleArrayList data) {
+    private DoubleColumn(final String name, final DoubleArrayList data) {
         super(NUMBER, name);
         this.data = data;
     }
@@ -219,9 +222,9 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
      * @return A list, possibly empty, of the largest observations
      */
     @Override
-    public DoubleArrayList top(int n) {
-        DoubleArrayList top = new DoubleArrayList();
-        double[] values = data.toDoubleArray();
+    public DoubleArrayList top(final int n) {
+        final DoubleArrayList top = new DoubleArrayList();
+        final double[] values = data.toDoubleArray();
         DoubleArrays.parallelQuickSort(values, descendingComparator);
         for (int i = 0; i < n && i < values.length; i++) {
             top.add(values[i]);
@@ -238,9 +241,9 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
      * @return A list, possibly empty, of the smallest n observations
      */
     @Override
-    public DoubleArrayList bottom(int n) {
-        DoubleArrayList bottom = new DoubleArrayList();
-        double[] values = data.toDoubleArray();
+    public DoubleArrayList bottom(final int n) {
+        final DoubleArrayList bottom = new DoubleArrayList();
+        final double[] values = data.toDoubleArray();
         DoubleArrays.parallelQuickSort(values);
         for (int i = 0; i < n && i < values.length; i++) {
             bottom.add(values[i]);
@@ -253,11 +256,11 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
      */
     @Override
     public Column unique() {
-        DoubleSet doubles = new DoubleOpenHashSet();
+        final DoubleSet doubles = new DoubleOpenHashSet();
         for (int i = 0; i < size(); i++) {
             doubles.add(data.getDouble(i));
         }
-        DoubleColumn column = DoubleColumn.create(name() + " Unique values", doubles.size());
+        final DoubleColumn column = DoubleColumn.create(name() + " Unique values", doubles.size());
         doubles.forEach((DoubleConsumer) column::append);
         return column;
     }
@@ -274,24 +277,22 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
      * Adds the given float to this column
      */
     @Override
-    public DoubleColumn append(float f) {
+    public void append(final float f) {
         data.add(f);
-        return this;
     }
 
     /**
      * Adds the given double to this column
      */
     @Override
-    public DoubleColumn append(double d) {
+    public void append(final double d) {
         data.add(d);
-        return this;
     }
 
 
     @Override
-    public String getString(int row) {
-        double value = data.getDouble(row);
+    public String getString(final int row) {
+        final double value = data.getDouble(row);
         if (NumberColumn.valueIsMissing(value)) {
             return "";
         }
@@ -299,12 +300,12 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
     }
 
     @Override
-    public double getDouble(int row) {
+    public double getDouble(final int row) {
         return get(row);
     }
 
     @Override
-    public String getUnformattedString(int row) {
+    public String getUnformattedString(final int row) {
         return String.valueOf(get(row));
     }
 
@@ -314,26 +315,26 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
     }
 
     @Override
-    public DoubleColumn emptyCopy(int rowSize) {
-        DoubleColumn column = DoubleColumn.create(name(), rowSize);
+    public DoubleColumn emptyCopy(final int rowSize) {
+        final DoubleColumn column = DoubleColumn.create(name(), rowSize);
         column.setPrintFormatter(printFormatter);
         column.locale = locale;
         return column;
     }
 
     @Override
-    public NumberColumn lead(int n) {
-        NumberColumn numberColumn = lag(-n);
+    public NumberColumn lead(final int n) {
+        final NumberColumn numberColumn = lag(-n);
         numberColumn.setName(name() + " lead(" + n + ")");
         return numberColumn;
     }
 
     @Override
-    public NumberColumn lag(int n) {
-        int srcPos = n >= 0 ? 0 : 0 - n;
-        double[] dest = new double[size()];
-        int destPos = n <= 0 ? 0 : n;
-        int length = n >= 0 ? size() - n : size() + n;
+    public NumberColumn lag(final int n) {
+        final int srcPos = n >= 0 ? 0 : 0 - n;
+        final double[] dest = new double[size()];
+        final int destPos = n <= 0 ? 0 : n;
+        final int length = n >= 0 ? size() - n : size() + n;
 
         for (int i = 0; i < size(); i++) {
             dest[i] = MISSING_VALUE;
@@ -341,7 +342,7 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
 
         System.arraycopy(data.toDoubleArray(), srcPos, dest, destPos, length);
 
-        DoubleColumn copy = emptyCopy(size());
+        final DoubleColumn copy = emptyCopy(size());
         copy.data = new DoubleArrayList(dest);
         copy.setName(name() + " lag(" + n + ")");
         return copy;
@@ -349,7 +350,7 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
 
     @Override
     public NumberColumn copy() {
-        DoubleColumn column = emptyCopy(size());
+        final DoubleColumn column = emptyCopy(size());
         column.data = data.clone();
         return column;
     }
@@ -375,13 +376,12 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
     }
 
     @Override
-    public DoubleColumn appendCell(String object) {
+    public void appendCell(final String object) {
         try {
             append(convert(object));
-        } catch (NumberFormatException e) {
+        } catch (final NumberFormatException e) {
             throw new NumberFormatException(name() + ": " + e.getMessage());
         }
-        return this;
     }
 
     /**
@@ -390,8 +390,8 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
      * @throws ClassCastException if the returned value will not fit in an int
      */
     @Override
-    public Integer roundInt(int i) {
-        double value = get(i);
+    public Integer roundInt(final int i) {
+        final double value = get(i);
         if (NumberColumn.valueIsMissing(value)) {
             return null;
         }
@@ -405,8 +405,8 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
      * @return the value at i, rounded to the nearest integer
      */
     @Override
-    public long getLong(int i) {
-        double value = data.getDouble(i);
+    public long getLong(final int i) {
+        final double value = data.getDouble(i);
         return NumberColumn.valueIsMissing(value) ? DateTimeColumn.MISSING_VALUE : Math.round(value);
     }
 
@@ -420,14 +420,13 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
     }
 
     @Override
-    public double get(int index) {
+    public double get(final int index) {
         return data.getDouble(index);
     }
 
     @Override
-    public DoubleColumn set(int r, double value) {
+    public void set(final int r, final double value) {
         data.set(r, value);
-        return this;
     }
 
     /**
@@ -438,16 +437,15 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
      * myColumn.set(4.0, myColumn.valueIsMissing()); // no more missing values
      */
     @Override
-    public DoubleColumn set(Selection rowSelection, double newValue) {
-        for (int row : rowSelection) {
+    public void set(final Selection rowSelection, final double newValue) {
+        for (final int row : rowSelection) {
             set(row, newValue);
         }
-        return this;
     }
 
     @Override
     public double[] asDoubleArray() {
-        double[] output = new double[data.size()];
+        final double[] output = new double[data.size()];
         for (int i = 0; i < data.size(); i++) {
             output[i] = data.getDouble(i);
         }
@@ -455,9 +453,9 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
     }
 
     @Override
-    public void append(Column column) {
+    public void append(final Column column) {
         Preconditions.checkArgument(column.type() == this.type());
-        NumberColumn numberColumn = (NumberColumn) column;
+        final NumberColumn numberColumn = (NumberColumn) column;
         for (int i = 0; i < numberColumn.size(); i++) {
             append(numberColumn.get(i));
         }
@@ -469,20 +467,20 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
     }
 
     @Override
-    public NumberColumn where(Filter filter) {
+    public NumberColumn where(final Filter filter) {
         return (NumberColumn) subset(filter.apply(this));
     }
 
     @Override
-    public NumberColumn where(Selection selection) {
+    public NumberColumn where(final Selection selection) {
         return (NumberColumn) subset(selection);
     }
 
     @Override
-    public Selection eval(DoublePredicate predicate) {
-        Selection bitmap = new BitmapBackedSelection();
+    public Selection eval(final DoublePredicate predicate) {
+        final Selection bitmap = new BitmapBackedSelection();
         for (int idx = 0; idx < data.size(); idx++) {
-            double next = data.getDouble(idx);
+            final double next = data.getDouble(idx);
             if (predicate.test(next)) {
                 bitmap.add(idx);
             }
@@ -491,8 +489,8 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
     }
 
     @Override
-    public Selection eval(DoubleBiPredicate predicate, NumberColumn otherColumn) {
-        Selection selection = new BitmapBackedSelection();
+    public Selection eval(final DoubleBiPredicate predicate, final NumberColumn otherColumn) {
+        final Selection selection = new BitmapBackedSelection();
         for (int idx = 0; idx < size(); idx++) {
             if (predicate.test(get(idx), otherColumn.get(idx))) {
                 selection.add(idx);
@@ -502,11 +500,11 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
     }
 
     @Override
-    public Selection eval(DoubleBiPredicate predicate, Number number) {
-        double value = number.doubleValue();
-        Selection bitmap = new BitmapBackedSelection();
+    public Selection eval(final DoubleBiPredicate predicate, final Number number) {
+        final double value = number.doubleValue();
+        final Selection bitmap = new BitmapBackedSelection();
         for (int idx = 0; idx < data.size(); idx++) {
-            double next = data.getDouble(idx);
+            final double next = data.getDouble(idx);
             if (predicate.test(next, value)) {
                 bitmap.add(idx);
             }
@@ -515,11 +513,11 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
     }
 
     @Override
-    public Selection eval(BiPredicate<Number, Number> predicate, Number number) {
-        double value = number.doubleValue();
-        Selection bitmap = new BitmapBackedSelection();
+    public Selection eval(final BiPredicate<Number, Number> predicate, final Number number) {
+        final double value = number.doubleValue();
+        final Selection bitmap = new BitmapBackedSelection();
         for (int idx = 0; idx < data.size(); idx++) {
-            double next = data.getDouble(idx);
+            final double next = data.getDouble(idx);
             if (predicate.test(next, value)) {
                 bitmap.add(idx);
             }
@@ -528,12 +526,12 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
     }
 
     @Override
-    public Selection eval(DoubleRangePredicate predicate, Number rangeStart, Number rangeEnd) {
-        double start = rangeStart.doubleValue();
-        double end = rangeEnd.doubleValue();
-        Selection bitmap = new BitmapBackedSelection();
+    public Selection eval(final DoubleRangePredicate predicate, final Number rangeStart, final Number rangeEnd) {
+        final double start = rangeStart.doubleValue();
+        final double end = rangeEnd.doubleValue();
+        final Selection bitmap = new BitmapBackedSelection();
         for (int idx = 0; idx < data.size(); idx++) {
-            double next = data.getDouble(idx);
+            final double next = data.getDouble(idx);
             if (predicate.test(next, start, end)) {
                 bitmap.add(idx);
             }
@@ -542,14 +540,14 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
     }
 
     @Override
-    public Selection isIn(Number... numbers) {
+    public Selection isIn(final Number... numbers) {
         return isIn(Arrays.stream(numbers).mapToDouble(Number::doubleValue).toArray());
     }
 
     @Override
-    public Selection isIn(double... doubles) {
-        Selection results = new BitmapBackedSelection();
-        DoubleRBTreeSet doubleSet = new DoubleRBTreeSet(doubles);
+    public Selection isIn(final double... doubles) {
+        final Selection results = new BitmapBackedSelection();
+        final DoubleRBTreeSet doubleSet = new DoubleRBTreeSet(doubles);
         for (int i = 0; i < size(); i++) {
             if (doubleSet.contains(get(i))) {
                 results.add(i);
@@ -559,16 +557,16 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
     }
 
     @Override
-    public Selection isNotIn(Number... numbers) {
-        Selection results = new BitmapBackedSelection();
+    public Selection isNotIn(final Number... numbers) {
+        final Selection results = new BitmapBackedSelection();
         results.addRange(0, size());
         results.andNot(isIn(numbers));
         return results;
     }
 
     @Override
-    public Selection isNotIn(double... doubles) {
-        Selection results = new BitmapBackedSelection();
+    public Selection isNotIn(final double... doubles) {
+        final Selection results = new BitmapBackedSelection();
         results.addRange(0, size());
         results.andNot(isIn(doubles));
         return results;
@@ -580,7 +578,7 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
     }
 
     @Override
-    public boolean contains(double value) {
+    public boolean contains(final double value) {
         return data.contains(value);
     }
 
@@ -593,13 +591,13 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
      * Returns the contents of the cell at rowNumber as a byte[]
      */
     @Override
-    public byte[] asBytes(int rowNumber) {
+    public byte[] asBytes(final int rowNumber) {
         return ByteBuffer.allocate(byteSize()).putDouble(get(rowNumber)).array();
     }
 
     @Override
     public int[] asIntArray() {  // TODO: Need to figure out how to handle NaN -> Maybe just use a list with nulls?
-        int[] result = new int[size()];
+        final int[] result = new int[size()];
         for (int i = 0; i < size(); i++) {
             result[i] = roundInt(i);
         }
@@ -608,8 +606,8 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
 
     @Override
     public IntSet asIntegerSet() {
-        IntSet ints = new IntOpenHashSet();
-        for (double d : this) {
+        final IntSet ints = new IntOpenHashSet();
+        for (final double d : this) {
             if (!NumberColumn.valueIsMissing(d)) {
                 ints.add((int) Math.round(d));
             }
@@ -622,4 +620,43 @@ public class DoubleColumn extends AbstractColumn implements NumberColumn {
         return data.clone();
     }
 
+    // fillWith methods
+
+    @Override
+    public DoubleColumn fillWith(final DoubleIterator iterator) {
+        for (int r = 0; r < size(); r++) {
+            if (!iterator.hasNext()) {
+                break;
+            }
+            set(r, iterator.nextDouble());
+        }
+        return this;
+    }
+
+    @Override
+    public DoubleColumn fillWith(final DoubleIterable iterable) {
+        DoubleIterator iterator = null;
+        for (int r = 0; r < size(); r++) {
+            if (iterator == null || (!iterator.hasNext())) {
+                iterator = iterable.iterator();
+                if (!iterator.hasNext()) {
+                    break;
+                }
+            }
+            set(r, iterator.nextDouble());
+        }
+        return this;
+    }
+
+    @Override
+    public DoubleColumn fillWith(final DoubleSupplier supplier) {
+        for (int r = 0; r < size(); r++) {
+            try {
+                set(r, supplier.getAsDouble());
+            } catch (final Exception e) {
+                break;
+            }
+        }
+        return this;
+    }
 }
diff --git a/core/src/main/java/tech/tablesaw/api/NumberColumn.java b/core/src/main/java/tech/tablesaw/api/NumberColumn.java
index 3ef6e04a..6d964532 100644
--- a/core/src/main/java/tech/tablesaw/api/NumberColumn.java
+++ b/core/src/main/java/tech/tablesaw/api/NumberColumn.java
@@ -1,5 +1,33 @@
 package tech.tablesaw.api;
 
+import static tech.tablesaw.aggregate.AggregateFunctions.geometricMean;
+import static tech.tablesaw.aggregate.AggregateFunctions.kurtosis;
+import static tech.tablesaw.aggregate.AggregateFunctions.max;
+import static tech.tablesaw.aggregate.AggregateFunctions.mean;
+import static tech.tablesaw.aggregate.AggregateFunctions.median;
+import static tech.tablesaw.aggregate.AggregateFunctions.min;
+import static tech.tablesaw.aggregate.AggregateFunctions.populationVariance;
+import static tech.tablesaw.aggregate.AggregateFunctions.product;
+import static tech.tablesaw.aggregate.AggregateFunctions.quadraticMean;
+import static tech.tablesaw.aggregate.AggregateFunctions.quartile1;
+import static tech.tablesaw.aggregate.AggregateFunctions.quartile3;
+import static tech.tablesaw.aggregate.AggregateFunctions.range;
+import static tech.tablesaw.aggregate.AggregateFunctions.skewness;
+import static tech.tablesaw.aggregate.AggregateFunctions.stdDev;
+import static tech.tablesaw.aggregate.AggregateFunctions.sum;
+import static tech.tablesaw.aggregate.AggregateFunctions.sumOfLogs;
+import static tech.tablesaw.aggregate.AggregateFunctions.sumOfSquares;
+import static tech.tablesaw.aggregate.AggregateFunctions.variance;
+import static tech.tablesaw.api.ColumnType.NUMBER;
+
+import java.text.NumberFormat;
+import java.util.function.DoublePredicate;
+
+import org.apache.commons.math3.exception.NotANumberException;
+import org.apache.commons.math3.stat.correlation.KendallsCorrelation;
+import org.apache.commons.math3.stat.correlation.PearsonsCorrelation;
+import org.apache.commons.math3.stat.correlation.SpearmansCorrelation;
+
 import it.unimi.dsi.fastutil.doubles.DoubleArrayList;
 import it.unimi.dsi.fastutil.doubles.DoubleIterable;
 import it.unimi.dsi.fastutil.doubles.DoubleIterator;
@@ -8,13 +36,10 @@ import it.unimi.dsi.fastutil.doubles.DoubleOpenHashSet;
 import it.unimi.dsi.fastutil.doubles.DoubleSet;
 import it.unimi.dsi.fastutil.ints.IntComparator;
 import it.unimi.dsi.fastutil.ints.IntSet;
-import org.apache.commons.math3.exception.NotANumberException;
-import org.apache.commons.math3.stat.correlation.KendallsCorrelation;
-import org.apache.commons.math3.stat.correlation.PearsonsCorrelation;
-import org.apache.commons.math3.stat.correlation.SpearmansCorrelation;
 import tech.tablesaw.aggregate.AggregateFunctions;
 import tech.tablesaw.columns.Column;
 import tech.tablesaw.columns.numbers.NumberColumnFormatter;
+import tech.tablesaw.columns.numbers.NumberFillers;
 import tech.tablesaw.columns.numbers.NumberFilters;
 import tech.tablesaw.columns.numbers.NumberMapFunctions;
 import tech.tablesaw.columns.numbers.Stats;
@@ -23,13 +48,7 @@ import tech.tablesaw.filtering.predicates.DoubleBiPredicate;
 import tech.tablesaw.filtering.predicates.DoubleRangePredicate;
 import tech.tablesaw.selection.Selection;
 
-import java.text.NumberFormat;
-import java.util.function.DoublePredicate;
-
-import static tech.tablesaw.aggregate.AggregateFunctions.*;
-import static tech.tablesaw.api.ColumnType.NUMBER;
-
-public interface NumberColumn extends Column, DoubleIterable, IntConvertibleColumn, NumberMapFunctions, NumberFilters, CategoricalColumn {
+public interface NumberColumn extends Column, DoubleIterable, IntConvertibleColumn, NumberMapFunctions, NumberFilters, NumberFillers<NumberColumn>, CategoricalColumn {
     double MISSING_VALUE = (Double) NUMBER.getMissingValue();
 
     static boolean valueIsMissing(double value) {
@@ -59,9 +78,9 @@ public interface NumberColumn extends Column, DoubleIterable, IntConvertibleColu
 
     double firstElement();
 
-    NumberColumn append(float f);
+    void append(float f);
 
-    NumberColumn append(double d);
+    void append(double d);
 
     @Override
     String getString(int row);
@@ -98,7 +117,7 @@ public interface NumberColumn extends Column, DoubleIterable, IntConvertibleColu
     boolean isEmpty();
 
     @Override
-    NumberColumn appendCell(String object);
+    void appendCell(String object);
 
     Integer roundInt(int i);
 
@@ -109,9 +128,9 @@ public interface NumberColumn extends Column, DoubleIterable, IntConvertibleColu
 
     double get(int index);
 
-    NumberColumn set(int r, double value);
+    void set(int r, double value);
 
-    NumberColumn set(Selection rowSelection, double newValue);
+    void set(Selection rowSelection, double newValue);
 
     double[] asDoubleArray();
 
diff --git a/core/src/main/java/tech/tablesaw/api/StringColumn.java b/core/src/main/java/tech/tablesaw/api/StringColumn.java
index ca848a08..e0ac732b 100644
--- a/core/src/main/java/tech/tablesaw/api/StringColumn.java
+++ b/core/src/main/java/tech/tablesaw/api/StringColumn.java
@@ -89,9 +89,8 @@ public class StringColumn extends AbstractColumn
     }
 
     @Override
-    public StringColumn appendMissing() {
+    public void appendMissing() {
         append(MISSING_VALUE);
-        return this;
     }
 
     private final IntComparator reverseDictionarySortComparator = new IntComparator() {
@@ -312,25 +311,22 @@ public class StringColumn extends AbstractColumn
      * myCatColumn.set("Dog", myCatColumn.isEqualTo("Cat")); // no more cats
      * myCatColumn.set("Fox", myCatColumn.valueIsMissing()); // no more missing values
      */
-    public StringColumn set(String newValue, Selection rowSelection) {
+    public void set(String newValue, Selection rowSelection) {
         for (int row : rowSelection) {
             set(row, newValue);
         }
-        return this;
     }
 
-    public StringColumn set(int rowIndex, String stringValue) {
-        String str = MISSING_VALUE;
-        if (stringValue != null) {
-            str = stringValue;
+    public void set(int rowIndex, String stringValue) {
+        if (stringValue == null) {
+            stringValue = MISSING_VALUE;
         }
-        int valueId = lookupTable.get(str);
+        int valueId = lookupTable.get(stringValue);
         if (valueId <= 0) {
             valueId = nextIndex.getAndIncrement();
-            lookupTable.put(valueId, str);
+            lookupTable.put(valueId, stringValue);
         }
         values.set(rowIndex, valueId);
-        return this;
     }
 
     @Override
@@ -419,17 +415,15 @@ public class StringColumn extends AbstractColumn
      *
      * @param stringValues a list of values
      */
-    public StringColumn addAll(List<String> stringValues) {
+    public void addAll(List<String> stringValues) {
         for (String stringValue : stringValues) {
             append(stringValue);
         }
-        return this;
     }
 
     @Override
-    public StringColumn appendCell(String object) {
+    public void appendCell(String object) {
         addValue(convert(object));
-        return this;
     }
 
     @Override
@@ -659,9 +653,8 @@ public class StringColumn extends AbstractColumn
     /**
      * Added for naming consistency with all other columns
      */
-    public StringColumn append(String value) {
+    public void append(String value) {
         appendCell(value);
-        return this;
     }
 
     @Override
@@ -703,20 +696,6 @@ public class StringColumn extends AbstractColumn
         return values.indexOf(lookupTable.get(value));
     }
 
-    public double countOccurrences(String value) {
-        if (!lookupTable.contains(value)) {
-            return 0;
-        }
-        int key = lookupTable.get(value);
-        int count = 0;
-        for (int k : values) {
-            if (k == key) {
-                count++;
-            }
-        }
-        return count;
-    }
-
     /**
      * A map that supports reversible key value pairs of int-String
      */
diff --git a/core/src/main/java/tech/tablesaw/api/TimeColumn.java b/core/src/main/java/tech/tablesaw/api/TimeColumn.java
index 614700e3..c0e39382 100644
--- a/core/src/main/java/tech/tablesaw/api/TimeColumn.java
+++ b/core/src/main/java/tech/tablesaw/api/TimeColumn.java
@@ -14,8 +14,27 @@
 
 package tech.tablesaw.api;
 
+import static tech.tablesaw.api.ColumnType.LOCAL_TIME;
+import static tech.tablesaw.columns.DateAndTimePredicates.isMissing;
+import static tech.tablesaw.columns.DateAndTimePredicates.isNotMissing;
+
+import java.nio.ByteBuffer;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
+
 import it.unimi.dsi.fastutil.ints.IntArrayList;
 import it.unimi.dsi.fastutil.ints.IntArrays;
 import it.unimi.dsi.fastutil.ints.IntComparator;
@@ -26,6 +45,7 @@ import tech.tablesaw.columns.AbstractColumn;
 import tech.tablesaw.columns.Column;
 import tech.tablesaw.columns.times.PackedLocalTime;
 import tech.tablesaw.columns.times.TimeColumnFormatter;
+import tech.tablesaw.columns.times.TimeFillers;
 import tech.tablesaw.columns.times.TimeFilters;
 import tech.tablesaw.columns.times.TimeMapFunctions;
 import tech.tablesaw.io.TypeUtils;
@@ -33,25 +53,10 @@ import tech.tablesaw.selection.BitmapBackedSelection;
 import tech.tablesaw.selection.Selection;
 import tech.tablesaw.sorting.comparators.DescendingIntComparator;
 
-import java.nio.ByteBuffer;
-import java.time.LocalTime;
-import java.time.format.DateTimeFormatter;
-import java.time.format.DateTimeParseException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-
-import static tech.tablesaw.api.ColumnType.LOCAL_TIME;
-import static tech.tablesaw.columns.DateAndTimePredicates.*;
-
 /**
  * A column in a base table that contains float values
  */
-public class TimeColumn extends AbstractColumn implements Iterable<LocalTime>, TimeFilters, TimeMapFunctions {
+public class TimeColumn extends AbstractColumn implements Iterable<LocalTime>, TimeFilters, TimeFillers<TimeColumn>, TimeMapFunctions {
 
     public static final int MISSING_VALUE = (Integer) LOCAL_TIME.getMissingValue();
 
@@ -115,9 +120,8 @@ public class TimeColumn extends AbstractColumn implements Iterable<LocalTime>, T
     }
 
     @Override
-    public TimeColumn appendMissing() {
+    public void appendMissing() {
         appendInternal(MISSING_VALUE);
-        return this;
     }
 
     public TimeColumn lag(int n) {
@@ -148,12 +152,11 @@ public class TimeColumn extends AbstractColumn implements Iterable<LocalTime>, T
         return data.size();
     }
 
-    public TimeColumn appendInternal(int f) {
+    public void appendInternal(int f) {
         data.add(f);
-        return this;
     }
 
-    public TimeColumn append(LocalTime time) {
+    public void append(LocalTime time) {
         int value;
         if (time == null) {
             value = MISSING_VALUE;
@@ -161,7 +164,6 @@ public class TimeColumn extends AbstractColumn implements Iterable<LocalTime>, T
             value = PackedLocalTime.pack(time);
         }
         appendInternal(value);
-        return this;
     }
 
     @Override
@@ -373,9 +375,8 @@ public class TimeColumn extends AbstractColumn implements Iterable<LocalTime>, T
     }
 
     @Override
-    public TimeColumn appendCell(String object) {
+    public void appendCell(String object) {
         appendInternal(convert(object));
-        return this;
     }
 
     @Override
@@ -495,14 +496,12 @@ public class TimeColumn extends AbstractColumn implements Iterable<LocalTime>, T
         return bottom;
     }
 
-    public TimeColumn set(int index, int value) {
+    public void set(int index, int value) {
         data.set(index, value);
-        return this;
     }
 
-    public TimeColumn set(int index, LocalTime value) {
+    public void set(int index, LocalTime value) {
         set(index, PackedLocalTime.pack(value));
-        return this;
     }
 
     /**
@@ -512,11 +511,10 @@ public class TimeColumn extends AbstractColumn implements Iterable<LocalTime>, T
      * Example:
      * myColumn.set(LocalTime.now(), myColumn.valueIsMissing()); // no more missing values
      */
-    public TimeColumn set(LocalTime newValue, Selection rowSelection) {
+    public void set(LocalTime newValue, Selection rowSelection) {
         for (int row : rowSelection) {
             set(row, newValue);
         }
-        return this;
     }
 
     /**
@@ -607,4 +605,79 @@ public class TimeColumn extends AbstractColumn implements Iterable<LocalTime>, T
         return (TimeColumn) subset(selection);
     }
 
-}
\ No newline at end of file
+    // fillWith methods
+
+    private TimeColumn fillWith(int count, Iterator<LocalTime> iterator, Consumer<LocalTime> acceptor) {
+        for (int r = 0; r < count; r++) {
+            if (!iterator.hasNext()) {
+                break;
+            }
+            acceptor.accept(iterator.next());
+        }
+        return this;
+    }
+
+    @Override
+    public TimeColumn fillWith(Iterator<LocalTime> iterator) {
+        int[] r = new int[1];
+        fillWith(size(), iterator, date -> set(r[0]++, date));
+        return this;
+    }
+
+    public static TimeColumn createWith(String name, int size, Iterator<LocalTime> iterator) {
+        TimeColumn column = create(name, size, Locale.getDefault());
+        column.fillWith(size, iterator, column::append);
+        return column;
+    }
+
+    private TimeColumn fillWith(int count, Iterable<LocalTime> iterable, Consumer<LocalTime> acceptor) {
+        Iterator<LocalTime> iterator = null;
+        for (int r = 0; r < count; r++) {
+            if (iterator == null || (!iterator.hasNext())) {
+                iterator = iterable.iterator();
+                if (!iterator.hasNext()) {
+                    break;
+                }
+            }
+            acceptor.accept(iterator.next());
+        }
+        return this;
+    }
+
+    @Override
+    public TimeColumn fillWith(Iterable<LocalTime> iterable) {
+        int[] r = new int[1];
+        fillWith(size(), iterable, date -> set(r[0]++, date));
+        return this;
+    }
+
+    public static TimeColumn createWith(String name, int size, Iterable<LocalTime> iterable) {
+        TimeColumn column = create(name, size, Locale.getDefault());
+        column.fillWith(size, iterable, column::append);
+        return column;
+    }
+
+    private TimeColumn fillWith(int count, Supplier<LocalTime> supplier, Consumer<LocalTime> acceptor) {
+        for (int r = 0; r < count; r++) {
+            try {
+                acceptor.accept(supplier.get());
+            } catch (Exception e) {
+                break;
+            }
+        }
+        return this;
+    }
+
+    @Override
+    public TimeColumn fillWith(Supplier<LocalTime> supplier) {
+        int[] r = new int[1];
+        fillWith(size(), supplier, date -> set(r[0]++, date));
+        return this;
+    }
+
+    public static TimeColumn createWith(String name, int size, Supplier<LocalTime> supplier) {
+        TimeColumn column = create(name, size, Locale.getDefault());
+        column.fillWith(size, supplier, column::append);
+        return column;
+    }
+}
diff --git a/core/src/main/java/tech/tablesaw/columns/AbstractColumn.java b/core/src/main/java/tech/tablesaw/columns/AbstractColumn.java
index c6761a8f..d80fb8dd 100644
--- a/core/src/main/java/tech/tablesaw/columns/AbstractColumn.java
+++ b/core/src/main/java/tech/tablesaw/columns/AbstractColumn.java
@@ -43,7 +43,7 @@ public abstract class AbstractColumn implements Column {
         return this;
     }
 
-    public abstract Column appendCell(String stringvalue);
+    public abstract void appendCell(String stringvalue);
 
     /**
      * Returns the width of the column in characters, for printing
diff --git a/core/src/main/java/tech/tablesaw/columns/Column.java b/core/src/main/java/tech/tablesaw/columns/Column.java
index e70c5257..5f68eafc 100644
--- a/core/src/main/java/tech/tablesaw/columns/Column.java
+++ b/core/src/main/java/tech/tablesaw/columns/Column.java
@@ -15,7 +15,6 @@
 package tech.tablesaw.columns;
 
 import it.unimi.dsi.fastutil.ints.IntComparator;
-import tech.tablesaw.aggregate.AggregateFunction;
 import tech.tablesaw.api.ColumnType;
 import tech.tablesaw.api.Table;
 import tech.tablesaw.selection.Selection;
@@ -45,11 +44,6 @@ public interface Column {
         return c;
     }
 
-    default double summarizeIf(Selection selection, AggregateFunction function) {
-        Column column = where(selection);
-        return function.summarize(column);
-    }
-
     /**
      * Returns the count of missing values in this column.
      *
@@ -166,7 +160,7 @@ public interface Column {
      */
     boolean isEmpty();
 
-    Column appendCell(String stringValue);
+    void appendCell(String stringValue);
 
     IntComparator rowComparator();
 
@@ -203,12 +197,8 @@ public interface Column {
         throw new UnsupportedOperationException("Method asDoubleArray() is not supported on non-numeric columns");
     }
 
-    /**
-     * Returns the width of the column in characters, for printing
-     */
     int columnWidth();
 
-
     Selection isMissing();
 
     Selection isNotMissing();
@@ -239,7 +229,7 @@ public interface Column {
     /**
      * Appends a missing value appropriate to the column
      */
-    Column appendMissing();
+    void appendMissing();
 
     Column where(Selection selection);
 
diff --git a/core/src/main/java/tech/tablesaw/columns/booleans/BooleanFillers.java b/core/src/main/java/tech/tablesaw/columns/booleans/BooleanFillers.java
new file mode 100644
index 00000000..b55c9b20
--- /dev/null
+++ b/core/src/main/java/tech/tablesaw/columns/booleans/BooleanFillers.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tech.tablesaw.columns.booleans;
+
+import java.util.function.Supplier;
+
+import it.unimi.dsi.fastutil.booleans.BooleanIterable;
+import it.unimi.dsi.fastutil.booleans.BooleanIterator;
+
+public interface BooleanFillers<T> {
+
+    T fillWith(BooleanIterator iterator);
+
+    default T fillWith(final BooleanIterable iterable) {
+        return fillWith(iterable.iterator());
+    }
+
+    T fillWith(Supplier<Boolean> supplier);
+}
diff --git a/core/src/main/java/tech/tablesaw/columns/booleans/fillers/BooleanIterable.java b/core/src/main/java/tech/tablesaw/columns/booleans/fillers/BooleanIterable.java
new file mode 100644
index 00000000..2a35e75a
--- /dev/null
+++ b/core/src/main/java/tech/tablesaw/columns/booleans/fillers/BooleanIterable.java
@@ -0,0 +1,45 @@
+package tech.tablesaw.columns.booleans.fillers;
+
+import it.unimi.dsi.fastutil.booleans.BooleanIterator;
+
+public class BooleanIterable implements it.unimi.dsi.fastutil.booleans.BooleanIterable {
+
+    private final long bits;
+    private final int length;
+
+    private BooleanIterable(final long bits, final int length) {
+        this.bits = bits;
+        this.length = length;
+    }
+
+    public static BooleanIterable bits(final long bits, final int length) {
+        return new BooleanIterable(bits, length);
+    }
+
+    @Override
+    public BooleanIterator iterator() {
+
+        return new BooleanIterator() {
+
+            int num = 0;
+            boolean next = bit(num);
+
+            private boolean bit(final int num) {
+                return ((bits >> (length - num - 1)) & 1) == 1;
+            }
+
+            @Override
+            public boolean hasNext() {
+                return (num < length);
+            }
+
+            @Override
+            public boolean nextBoolean() {
+                final boolean current = next;
+                num++;
+                next = bit(num);
+                return current;
+            }
+        };
+    }
+}
diff --git a/core/src/main/java/tech/tablesaw/columns/booleans/filters/IsFalse.java b/core/src/main/java/tech/tablesaw/columns/booleans/filters/IsFalse.java
index ef4694f7..7645ea99 100644
--- a/core/src/main/java/tech/tablesaw/columns/booleans/filters/IsFalse.java
+++ b/core/src/main/java/tech/tablesaw/columns/booleans/filters/IsFalse.java
@@ -32,8 +32,8 @@ public class IsFalse extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        BooleanColumn booleanColumn = (BooleanColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        BooleanColumn booleanColumn = (BooleanColumn) column;
         return booleanColumn.isFalse();
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/booleans/filters/IsTrue.java b/core/src/main/java/tech/tablesaw/columns/booleans/filters/IsTrue.java
index 00978eef..cbd2277f 100644
--- a/core/src/main/java/tech/tablesaw/columns/booleans/filters/IsTrue.java
+++ b/core/src/main/java/tech/tablesaw/columns/booleans/filters/IsTrue.java
@@ -32,8 +32,8 @@ public class IsTrue extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        BooleanColumn booleanColumn = (BooleanColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        BooleanColumn booleanColumn = (BooleanColumn) column;
         return booleanColumn.isTrue();
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/dates/DateFillers.java b/core/src/main/java/tech/tablesaw/columns/dates/DateFillers.java
new file mode 100644
index 00000000..846870ba
--- /dev/null
+++ b/core/src/main/java/tech/tablesaw/columns/dates/DateFillers.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tech.tablesaw.columns.dates;
+
+import java.time.LocalDate;
+import java.util.Iterator;
+import java.util.function.Supplier;
+
+public interface DateFillers<T> {
+
+    T fillWith(Iterator<LocalDate> iterator);
+
+    default T fillWith(final Iterable<LocalDate> iterable) {
+        return fillWith(iterable.iterator());
+    }
+
+    T fillWith(Supplier<LocalDate> supplier);
+}
diff --git a/core/src/main/java/tech/tablesaw/columns/dates/filters/BetweenExclusive.java b/core/src/main/java/tech/tablesaw/columns/dates/filters/BetweenExclusive.java
index 7f7483af..82c2dba9 100644
--- a/core/src/main/java/tech/tablesaw/columns/dates/filters/BetweenExclusive.java
+++ b/core/src/main/java/tech/tablesaw/columns/dates/filters/BetweenExclusive.java
@@ -39,8 +39,8 @@ public class BetweenExclusive extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        DateColumn dateColumn = (DateColumn) column;
         int packed1 = PackedLocalDate.pack(low);
         Selection matches = dateColumn.eval(PackedLocalDate::isAfter, packed1);
         int packed = PackedLocalDate.pack(high);
diff --git a/core/src/main/java/tech/tablesaw/columns/dates/filters/BetweenInclusive.java b/core/src/main/java/tech/tablesaw/columns/dates/filters/BetweenInclusive.java
index 0a847261..7017ac35 100644
--- a/core/src/main/java/tech/tablesaw/columns/dates/filters/BetweenInclusive.java
+++ b/core/src/main/java/tech/tablesaw/columns/dates/filters/BetweenInclusive.java
@@ -39,8 +39,8 @@ public class BetweenInclusive extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        DateColumn dateColumn = (DateColumn) column;
         int packed1 = PackedLocalDate.pack(low);
         Selection matches = dateColumn.eval(PackedLocalDate::isOnOrAfter, packed1);
         int packed = PackedLocalDate.pack(high);
diff --git a/core/src/main/java/tech/tablesaw/columns/dates/filters/ColumnEqualTo.java b/core/src/main/java/tech/tablesaw/columns/dates/filters/ColumnEqualTo.java
index 7f00b605..b3b662aa 100644
--- a/core/src/main/java/tech/tablesaw/columns/dates/filters/ColumnEqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/dates/filters/ColumnEqualTo.java
@@ -43,11 +43,11 @@ public class ColumnEqualTo extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        DateColumn dateColumn = (DateColumn) columnToFilter;
         return dateColumn.eval(isEqualTo, (DateColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/dates/filters/ColumnIsAfter.java b/core/src/main/java/tech/tablesaw/columns/dates/filters/ColumnIsAfter.java
index 550ab1f5..5802c843 100644
--- a/core/src/main/java/tech/tablesaw/columns/dates/filters/ColumnIsAfter.java
+++ b/core/src/main/java/tech/tablesaw/columns/dates/filters/ColumnIsAfter.java
@@ -42,11 +42,11 @@ public class ColumnIsAfter extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        DateColumn dateColumn = (DateColumn) columnToFilter;
         return dateColumn.eval(isGreaterThan, (DateColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/dates/filters/ColumnIsBefore.java b/core/src/main/java/tech/tablesaw/columns/dates/filters/ColumnIsBefore.java
index d92eccc9..f9f4d8d3 100644
--- a/core/src/main/java/tech/tablesaw/columns/dates/filters/ColumnIsBefore.java
+++ b/core/src/main/java/tech/tablesaw/columns/dates/filters/ColumnIsBefore.java
@@ -42,11 +42,11 @@ public class ColumnIsBefore extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        DateColumn dateColumn = (DateColumn) columnToFilter;
         return dateColumn.eval(isLessThan, (DateColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/dates/filters/ColumnNotEqualTo.java b/core/src/main/java/tech/tablesaw/columns/dates/filters/ColumnNotEqualTo.java
index 83130642..7c253a0d 100644
--- a/core/src/main/java/tech/tablesaw/columns/dates/filters/ColumnNotEqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/dates/filters/ColumnNotEqualTo.java
@@ -43,11 +43,11 @@ public class ColumnNotEqualTo extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        DateColumn dateColumn = (DateColumn) columnToFilter;
         return dateColumn.eval(isNotEqualTo, (DateColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/dates/filters/EqualTo.java b/core/src/main/java/tech/tablesaw/columns/dates/filters/EqualTo.java
index ec4a6415..7c01564a 100644
--- a/core/src/main/java/tech/tablesaw/columns/dates/filters/EqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/dates/filters/EqualTo.java
@@ -37,8 +37,8 @@ public class EqualTo extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        DateColumn dateColumn = (DateColumn) column;
         return dateColumn.isEqualTo(value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/dates/filters/IsAfter.java b/core/src/main/java/tech/tablesaw/columns/dates/filters/IsAfter.java
index 59d52de2..6d3bf9c4 100644
--- a/core/src/main/java/tech/tablesaw/columns/dates/filters/IsAfter.java
+++ b/core/src/main/java/tech/tablesaw/columns/dates/filters/IsAfter.java
@@ -40,8 +40,8 @@ public class IsAfter extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        DateColumn dateColumn = (DateColumn) column;
         return dateColumn.eval(PackedLocalDate::isAfter, value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/dates/filters/IsBefore.java b/core/src/main/java/tech/tablesaw/columns/dates/filters/IsBefore.java
index 83be1259..1e95759f 100644
--- a/core/src/main/java/tech/tablesaw/columns/dates/filters/IsBefore.java
+++ b/core/src/main/java/tech/tablesaw/columns/dates/filters/IsBefore.java
@@ -37,8 +37,8 @@ public class IsBefore extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        DateColumn dateColumn = (DateColumn) column;
         return dateColumn.eval(PackedLocalDate::isBefore, value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/dates/filters/IsOnOrAfter.java b/core/src/main/java/tech/tablesaw/columns/dates/filters/IsOnOrAfter.java
index d8d23e05..70af75c6 100644
--- a/core/src/main/java/tech/tablesaw/columns/dates/filters/IsOnOrAfter.java
+++ b/core/src/main/java/tech/tablesaw/columns/dates/filters/IsOnOrAfter.java
@@ -40,8 +40,8 @@ public class IsOnOrAfter extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        DateColumn dateColumn = (DateColumn) column;
         return dateColumn.eval(PackedLocalDate::isOnOrAfter, value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/dates/filters/IsOnOrBefore.java b/core/src/main/java/tech/tablesaw/columns/dates/filters/IsOnOrBefore.java
index 02362be7..099761c6 100644
--- a/core/src/main/java/tech/tablesaw/columns/dates/filters/IsOnOrBefore.java
+++ b/core/src/main/java/tech/tablesaw/columns/dates/filters/IsOnOrBefore.java
@@ -40,8 +40,8 @@ public class IsOnOrBefore extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        DateColumn dateColumn = (DateColumn) column;
         return dateColumn.eval(PackedLocalDate::isOnOrBefore, value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/DateTimeFillers.java b/core/src/main/java/tech/tablesaw/columns/datetimes/DateTimeFillers.java
new file mode 100644
index 00000000..5f501c38
--- /dev/null
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/DateTimeFillers.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tech.tablesaw.columns.datetimes;
+
+import java.time.LocalDateTime;
+import java.util.Iterator;
+import java.util.function.Supplier;
+
+public interface DateTimeFillers<T> {
+
+    T fillWith(Iterator<LocalDateTime> iterator);
+
+    default T fillWith(final Iterable<LocalDateTime> iterable) {
+        return fillWith(iterable.iterator());
+    }
+
+    T fillWith(Supplier<LocalDateTime> supplier);
+}
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/fillers/TemporalRangeIterable.java b/core/src/main/java/tech/tablesaw/columns/datetimes/fillers/TemporalRangeIterable.java
new file mode 100644
index 00000000..912baf51
--- /dev/null
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/fillers/TemporalRangeIterable.java
@@ -0,0 +1,63 @@
+package tech.tablesaw.columns.datetimes.fillers;
+
+import java.time.temporal.Temporal;
+import java.time.temporal.TemporalUnit;
+import java.util.Iterator;
+
+public class TemporalRangeIterable<T extends Temporal> implements Iterable<T> {
+
+    private final T from, to;
+    private final long by;
+    private final TemporalUnit byUnit;
+    private final boolean including;
+    private final int count;
+
+    private TemporalRangeIterable(final T from, final T to, final boolean including, final long by,
+            final TemporalUnit byUnit, final int count) {
+        this.from = from;
+        this.to = to;
+        this.including = including;
+        this.by = by;
+        this.byUnit = byUnit;
+        this.count = count;
+    }
+
+    private static <T extends Temporal> TemporalRangeIterable<T> range(final T from, final T to, final long by,
+            final TemporalUnit byUnit, final int count) {
+        return new TemporalRangeIterable<T>(from, to, false, by, byUnit, count);
+    }
+
+    public static <T extends Temporal> TemporalRangeIterable<T> range(final T from, final T to, final long by,
+            final TemporalUnit byUnit) {
+        return range(from, to, by, byUnit, -1);
+    }
+
+    public static <T extends Temporal> TemporalRangeIterable<T> range(final T from, final long by,
+            final TemporalUnit byUnit, final int count) {
+        return range(from, null, by, byUnit, count);
+    }
+
+    @Override
+    public Iterator<T> iterator() {
+
+        return new Iterator<T>() {
+
+            T next = from;
+            int num = 0;
+
+            @Override
+            public boolean hasNext() {
+                return (count < 0 || num < count)
+                        && (to == null || next.until(to, byUnit) > 0 || (including && next.equals(to)));
+            }
+
+            @Override
+            public T next() {
+                final T current = next;
+                next = (T) next.plus(by, byUnit);
+                num++;
+                return current;
+            }
+        };
+    }
+}
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/ColumnEqualTo.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/ColumnEqualTo.java
index feb4a08b..308b6ad7 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/ColumnEqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/ColumnEqualTo.java
@@ -43,11 +43,11 @@ public class ColumnEqualTo extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateTimeColumn dateColumn = (DateTimeColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        DateTimeColumn dateColumn = (DateTimeColumn) columnToFilter;
         return dateColumn.eval(isEqualTo, (DateTimeColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/ColumnIsAfter.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/ColumnIsAfter.java
index 58b1b61a..895cf767 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/ColumnIsAfter.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/ColumnIsAfter.java
@@ -42,11 +42,11 @@ public class ColumnIsAfter extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateTimeColumn dateColumn = (DateTimeColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        DateTimeColumn dateColumn = (DateTimeColumn) columnToFilter;
         return dateColumn.eval(isGreaterThan, (DateTimeColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/ColumnIsBefore.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/ColumnIsBefore.java
index d8fee6bf..e9e298ed 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/ColumnIsBefore.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/ColumnIsBefore.java
@@ -42,11 +42,11 @@ public class ColumnIsBefore extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateTimeColumn dateColumn = (DateTimeColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        DateTimeColumn dateColumn = (DateTimeColumn) columnToFilter;
         return dateColumn.eval(isLessThan, (DateTimeColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/ColumnNotEqualTo.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/ColumnNotEqualTo.java
index 1eb7cdf8..859f687f 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/ColumnNotEqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/ColumnNotEqualTo.java
@@ -43,11 +43,11 @@ public class ColumnNotEqualTo extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateTimeColumn dateColumn = (DateTimeColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        DateTimeColumn dateColumn = (DateTimeColumn) columnToFilter;
         return dateColumn.eval(isNotEqualTo, (DateTimeColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/EqualTo.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/EqualTo.java
index 78d33157..282f9b36 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/EqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/EqualTo.java
@@ -38,8 +38,8 @@ public class EqualTo extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateTimeColumn dateColumn = (DateTimeColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        DateTimeColumn dateColumn = (DateTimeColumn) column;
         return dateColumn.isEqualTo(value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsAfter.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsAfter.java
index aa2eb924..4cac79f0 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsAfter.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsAfter.java
@@ -49,8 +49,8 @@ public class IsAfter extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateTimeColumn dateColumn = (DateTimeColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        DateTimeColumn dateColumn = (DateTimeColumn) column;
         return dateColumn.eval(DateTimePredicates.isGreaterThan, PackedLocalDateTime.pack(value));
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsBefore.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsBefore.java
index bd696389..dd5eb10c 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsBefore.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsBefore.java
@@ -47,8 +47,8 @@ public class IsBefore extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateTimeColumn dateColumn = (DateTimeColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        DateTimeColumn dateColumn = (DateTimeColumn) column;
         return dateColumn.eval(DateTimePredicates.isLessThan, PackedLocalDateTime.pack(value));
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsFirstDayOfTheMonth.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsFirstDayOfTheMonth.java
index bf325a2b..4d23d60b 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsFirstDayOfTheMonth.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsFirstDayOfTheMonth.java
@@ -39,15 +39,15 @@ public class IsFirstDayOfTheMonth extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
+    public Selection apply(Column column) {
 
-        ColumnType type = columnBeingFiltered.type();
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isFirstDayOfMonth);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isFirstDayOfMonth);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsFriday.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsFriday.java
index 87235c81..d29c1868 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsFriday.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsFriday.java
@@ -39,14 +39,14 @@ public class IsFriday extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isFriday);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isFriday);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInApril.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInApril.java
index 16096b40..f98d7f3b 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInApril.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInApril.java
@@ -39,14 +39,14 @@ public class IsInApril extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isInApril);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isInApril);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInAugust.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInAugust.java
index 25c05b7a..bd4ffd01 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInAugust.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInAugust.java
@@ -39,14 +39,14 @@ public class IsInAugust extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isInAugust);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isInAugust);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInDecember.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInDecember.java
index dfcd3e39..48f4dfc4 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInDecember.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInDecember.java
@@ -39,14 +39,14 @@ public class IsInDecember extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isInDecember);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isInDecember);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInFebruary.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInFebruary.java
index db0971ad..4d64d84c 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInFebruary.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInFebruary.java
@@ -39,14 +39,14 @@ public class IsInFebruary extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isInFebruary);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isInFebruary);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInJanuary.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInJanuary.java
index 3e8fdf21..34e64473 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInJanuary.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInJanuary.java
@@ -39,14 +39,14 @@ public class IsInJanuary extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isInJanuary);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isInJanuary);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInJuly.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInJuly.java
index da56c55e..8b54bf40 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInJuly.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInJuly.java
@@ -37,14 +37,14 @@ public class IsInJuly extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.isInJuly();
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.isInJuly();
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInJune.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInJune.java
index c603d85b..6cf476a6 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInJune.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInJune.java
@@ -39,14 +39,14 @@ public class IsInJune extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isInJune);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isInJune);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInMarch.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInMarch.java
index 59048e92..e6d902f3 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInMarch.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInMarch.java
@@ -39,14 +39,14 @@ public class IsInMarch extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isInMarch);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isInMarch);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInMay.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInMay.java
index 6747cf78..b84c2ba6 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInMay.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInMay.java
@@ -39,14 +39,14 @@ public class IsInMay extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isInMay);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isInMay);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInNovember.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInNovember.java
index 5ff46dc3..d4bbfed0 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInNovember.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInNovember.java
@@ -39,14 +39,14 @@ public class IsInNovember extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isInNovember);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isInNovember);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInOctober.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInOctober.java
index dbc91fe4..4a909737 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInOctober.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInOctober.java
@@ -39,14 +39,14 @@ public class IsInOctober extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isInOctober);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isInOctober);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInQ1.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInQ1.java
index 06baf04a..4f94c3d5 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInQ1.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInQ1.java
@@ -39,14 +39,14 @@ public class IsInQ1 extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isInQ1);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isInQ1);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInQ2.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInQ2.java
index fbcb5cae..019142a6 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInQ2.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInQ2.java
@@ -39,14 +39,14 @@ public class IsInQ2 extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isInQ2);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isInQ2);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInQ3.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInQ3.java
index 17f7be1e..19c740cf 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInQ3.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInQ3.java
@@ -40,14 +40,14 @@ public class IsInQ3 extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isInQ3);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isInQ3);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInQ4.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInQ4.java
index e362a721..a2c5266e 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInQ4.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInQ4.java
@@ -39,14 +39,14 @@ public class IsInQ4 extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isInQ4);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isInQ4);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInSeptember.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInSeptember.java
index 6e7c377b..948b76a0 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInSeptember.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInSeptember.java
@@ -39,14 +39,14 @@ public class IsInSeptember extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isInSeptember);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isInSeptember);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInYear.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInYear.java
index 2518a9aa..9b54d807 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInYear.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsInYear.java
@@ -43,14 +43,14 @@ public class IsInYear extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isInYear, year);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(isInYear, year);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsLastDayOfTheMonth.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsLastDayOfTheMonth.java
index 0d6f2b3d..84174b94 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsLastDayOfTheMonth.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsLastDayOfTheMonth.java
@@ -39,14 +39,14 @@ public class IsLastDayOfTheMonth extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isLastDayOfMonth);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isLastDayOfMonth);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsMonday.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsMonday.java
index dbaae3dd..1788084b 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsMonday.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsMonday.java
@@ -39,14 +39,14 @@ public class IsMonday extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isMonday);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isMonday);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsOnOrAfter.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsOnOrAfter.java
index 16b18f07..92b18fbc 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsOnOrAfter.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsOnOrAfter.java
@@ -48,8 +48,8 @@ public class IsOnOrAfter extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateTimeColumn dateColumn = (DateTimeColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        DateTimeColumn dateColumn = (DateTimeColumn) column;
         return dateColumn.eval(DateTimePredicates.isGreaterThanOrEqualTo, value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsOnOrBefore.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsOnOrBefore.java
index a54f8cbb..55b9229d 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsOnOrBefore.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsOnOrBefore.java
@@ -47,8 +47,8 @@ public class IsOnOrBefore extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateTimeColumn dateColumn = (DateTimeColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        DateTimeColumn dateColumn = (DateTimeColumn) column;
         return dateColumn.eval(DateTimePredicates.isLessThanOrEqualTo, value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsSaturday.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsSaturday.java
index ce437938..207abbb4 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsSaturday.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsSaturday.java
@@ -39,14 +39,14 @@ public class IsSaturday extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isSaturday);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isSaturday);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsSunday.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsSunday.java
index bdad727d..851902c6 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsSunday.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsSunday.java
@@ -39,14 +39,14 @@ public class IsSunday extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isSunday);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isSunday);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsThursday.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsThursday.java
index 6129b0b6..a564cecb 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsThursday.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsThursday.java
@@ -39,14 +39,14 @@ public class IsThursday extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isThursday);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isThursday);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsTuesday.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsTuesday.java
index 51033599..48249cca 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsTuesday.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsTuesday.java
@@ -39,14 +39,14 @@ public class IsTuesday extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isTuesday);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isTuesday);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsWednesday.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsWednesday.java
index 2e171cc1..0e094fb1 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsWednesday.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/IsWednesday.java
@@ -39,14 +39,14 @@ public class IsWednesday extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_DATE:
-                DateColumn dateColumn = (DateColumn) columnBeingFiltered;
+                DateColumn dateColumn = (DateColumn) column;
                 return dateColumn.eval(PackedLocalDate::isWednesday);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isWednesday);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/NotEqualTo.java b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/NotEqualTo.java
index aa1c4022..eff00afb 100644
--- a/core/src/main/java/tech/tablesaw/columns/datetimes/filters/NotEqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/datetimes/filters/NotEqualTo.java
@@ -38,8 +38,8 @@ public class NotEqualTo extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        DateTimeColumn dateColumn = (DateTimeColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        DateTimeColumn dateColumn = (DateTimeColumn) column;
         return dateColumn.isNotEqualTo(value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/NumberColumnReference.java b/core/src/main/java/tech/tablesaw/columns/numbers/NumberColumnReference.java
index 32bb7b8b..05ab841f 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/NumberColumnReference.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/NumberColumnReference.java
@@ -58,8 +58,8 @@ import tech.tablesaw.filtering.composite.IsFalse;
  */
 public class NumberColumnReference extends ColumnReference {
 
-    public NumberColumnReference(String columnName) {
-        super(columnName);
+    public NumberColumnReference(String column) {
+        super(column);
     }
 
     public Filter isEqualTo(Number value) {
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/NumberFillers.java b/core/src/main/java/tech/tablesaw/columns/numbers/NumberFillers.java
new file mode 100644
index 00000000..5508d292
--- /dev/null
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/NumberFillers.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tech.tablesaw.columns.numbers;
+
+import java.util.function.DoubleSupplier;
+
+import it.unimi.dsi.fastutil.doubles.DoubleIterable;
+import it.unimi.dsi.fastutil.doubles.DoubleIterator;
+
+public interface NumberFillers<T> {
+
+    T fillWith(DoubleIterator iterator);
+
+    default T fillWith(final DoubleIterable iterable) {
+        return fillWith(iterable.iterator());
+    }
+
+    T fillWith(final DoubleSupplier supplier);
+}
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/fillers/DoubleRangeIterable.java b/core/src/main/java/tech/tablesaw/columns/numbers/fillers/DoubleRangeIterable.java
new file mode 100644
index 00000000..605f8151
--- /dev/null
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/fillers/DoubleRangeIterable.java
@@ -0,0 +1,64 @@
+package tech.tablesaw.columns.numbers.fillers;
+
+import it.unimi.dsi.fastutil.doubles.DoubleIterable;
+import it.unimi.dsi.fastutil.doubles.DoubleIterator;
+
+public class DoubleRangeIterable implements DoubleIterable {
+
+    private final double from, to, by;
+    private final boolean including;
+    private final int count;
+
+    private DoubleRangeIterable(final double from, final double to, final boolean including, final double by,
+            final int count) {
+        this.from = from;
+        this.to = to;
+        this.including = including;
+        this.by = by;
+        this.count = count;
+    }
+
+    private static DoubleRangeIterable range(final double from, final double to, final double by, final int count) {
+        return new DoubleRangeIterable(from, to, false, by, count);
+    }
+
+    public static DoubleRangeIterable range(final double from, final double to, final double by) {
+        return range(from, to, by, -1);
+    }
+
+    public static DoubleRangeIterable range(final double from, final double to) {
+        return range(from, to, 1.0);
+    }
+
+    public static DoubleRangeIterable range(final double from, final double by, final int count) {
+        return range(from, Double.NaN, by, count);
+    }
+
+    public static DoubleRangeIterable range(final double from, final int count) {
+        return range(from, 1.0, count);
+    }
+
+    @Override
+    public DoubleIterator iterator() {
+
+        return new DoubleIterator() {
+
+            double next = from;
+            int num = 0;
+
+            @Override
+            public boolean hasNext() {
+                return (count < 0 || num < count) && (Double.isNaN(to) || Math.abs(next - from) < Math.abs(to - from)
+                        || (including && next == to));
+            }
+
+            @Override
+            public double nextDouble() {
+                final double current = next;
+                next += by;
+                num++;
+                return current;
+            }
+        };
+    }
+}
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/BetweenExclusive.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/BetweenExclusive.java
index 03e41836..1d9881b0 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/BetweenExclusive.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/BetweenExclusive.java
@@ -36,8 +36,8 @@ public class BetweenExclusive extends ColumnFilter {
         return apply(relation.column(columnReference().getColumnName()));
     }
 
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        NumberColumn numberColumn = (NumberColumn) column;
         return numberColumn.isBetweenExclusive(low, high);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/BetweenInclusive.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/BetweenInclusive.java
index fd254a84..19d6d051 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/BetweenInclusive.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/BetweenInclusive.java
@@ -36,8 +36,8 @@ public class BetweenInclusive extends ColumnFilter {
         return apply(relation.column(columnReference().getColumnName()));
     }
 
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        NumberColumn numberColumn = (NumberColumn) column;
         return numberColumn.isBetweenInclusive(low, high);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/ColumnEqualTo.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/ColumnEqualTo.java
index 5a544bbc..1c93fd92 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/ColumnEqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/ColumnEqualTo.java
@@ -43,11 +43,11 @@ public class ColumnEqualTo extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        NumberColumn numberColumn = (NumberColumn) columnToFilter;
         return numberColumn.eval(isEqualTo, (NumberColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/ColumnGreaterThan.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/ColumnGreaterThan.java
index e8d30e32..acfdeeaa 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/ColumnGreaterThan.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/ColumnGreaterThan.java
@@ -20,7 +20,7 @@ import tech.tablesaw.columns.ColumnReference;
 import tech.tablesaw.filtering.TwoColumnFilter;
 import tech.tablesaw.selection.Selection;
 
-import static tech.tablesaw.columns.numbers.NumberPredicates.isGreaterThan;
+import static tech.tablesaw.columns.numbers.NumberPredicates.*;
 
 /**
  * A filtering that selects cells whose contents equal the given text ignoring case
@@ -43,11 +43,11 @@ public class ColumnGreaterThan extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        NumberColumn numberColumn = (NumberColumn) columnToFilter;
         return numberColumn.eval(isGreaterThan, (NumberColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/ColumnLessThan.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/ColumnLessThan.java
index b3f9c356..91ad0a8d 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/ColumnLessThan.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/ColumnLessThan.java
@@ -43,11 +43,11 @@ public class ColumnLessThan extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        NumberColumn numberColumn = (NumberColumn) columnToFilter;
         return numberColumn.eval(isLessThan, (NumberColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/EqualTo.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/EqualTo.java
index 1b7c6f17..d70b98bd 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/EqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/EqualTo.java
@@ -34,8 +34,8 @@ public class EqualTo extends ColumnFilter {
         return apply(relation.column(columnReference().getColumnName()));
     }
 
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        NumberColumn numberColumn = (NumberColumn) column;
         return numberColumn.isEqualTo(value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/GreaterThan.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/GreaterThan.java
index 33b53172..d1983b28 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/GreaterThan.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/GreaterThan.java
@@ -34,8 +34,8 @@ public class GreaterThan extends ColumnFilter {
         return apply(relation.column(columnReference().getColumnName()));
     }
 
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        NumberColumn numberColumn = (NumberColumn) column;
         return numberColumn.isGreaterThan(value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/GreaterThanOrEqualTo.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/GreaterThanOrEqualTo.java
index a60c04ea..14af87ae 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/GreaterThanOrEqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/GreaterThanOrEqualTo.java
@@ -34,8 +34,8 @@ public class GreaterThanOrEqualTo extends ColumnFilter {
         return apply(relation.column(columnReference().getColumnName()));
     }
 
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        NumberColumn numberColumn = (NumberColumn) column;
         return numberColumn.isGreaterThanOrEqualTo(value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsCloseTo.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsCloseTo.java
index d27114a5..a93bdbd9 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsCloseTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsCloseTo.java
@@ -36,8 +36,8 @@ public class IsCloseTo extends ColumnFilter {
         return apply(relation.column(columnReference().getColumnName()));
     }
 
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        NumberColumn numberColumn = (NumberColumn) column;
         return numberColumn.isCloseTo(target, margin);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsIn.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsIn.java
index 43c83114..e676deb6 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsIn.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsIn.java
@@ -46,8 +46,8 @@ public class IsIn extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        NumberColumn numberColumn = (NumberColumn) column;
         return numberColumn.isIn(doubles);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsNegative.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsNegative.java
index 0acf2051..65a27a1b 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsNegative.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsNegative.java
@@ -31,8 +31,8 @@ public class IsNegative extends ColumnFilter {
         return apply(relation.column(columnReference().getColumnName()));
     }
 
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        NumberColumn numberColumn = (NumberColumn) column;
         return numberColumn.isNegative();
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsNonNegative.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsNonNegative.java
index 89bfef62..cac95be9 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsNonNegative.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsNonNegative.java
@@ -31,8 +31,8 @@ public class IsNonNegative extends ColumnFilter {
         return apply(relation.column(columnReference().getColumnName()));
     }
 
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        NumberColumn numberColumn = (NumberColumn) column;
         return numberColumn.isNonNegative();
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsNotIn.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsNotIn.java
index b8f6a2ab..d5dec257 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsNotIn.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsNotIn.java
@@ -46,8 +46,8 @@ public class IsNotIn extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        NumberColumn numberColumn = (NumberColumn) column;
         return numberColumn.isNotIn(doubles);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsPositive.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsPositive.java
index e9004a78..b806468b 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsPositive.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsPositive.java
@@ -31,8 +31,8 @@ public class IsPositive extends ColumnFilter {
         return apply(relation.column(columnReference().getColumnName()));
     }
 
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        NumberColumn numberColumn = (NumberColumn) column;
         return numberColumn.isPositive();
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsZero.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsZero.java
index 1f854baf..1d642255 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsZero.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/IsZero.java
@@ -31,8 +31,8 @@ public class IsZero extends ColumnFilter {
         return apply(relation.column(columnReference().getColumnName()));
     }
 
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        NumberColumn numberColumn = (NumberColumn) column;
         return numberColumn.isZero();
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/LessThan.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/LessThan.java
index 71f86166..9949bfd9 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/LessThan.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/LessThan.java
@@ -34,8 +34,8 @@ public class LessThan extends ColumnFilter {
         return apply(relation.column(columnReference().getColumnName()));
     }
 
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        NumberColumn numberColumn = (NumberColumn) column;
         return numberColumn.isLessThan(value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/LessThanOrEqualTo.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/LessThanOrEqualTo.java
index 20784cad..dfcbdd67 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/LessThanOrEqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/LessThanOrEqualTo.java
@@ -36,8 +36,8 @@ public class LessThanOrEqualTo extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        NumberColumn numberColumn = (NumberColumn) column;
         return numberColumn.isLessThanOrEqualTo(value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/numbers/filters/NotEqualTo.java b/core/src/main/java/tech/tablesaw/columns/numbers/filters/NotEqualTo.java
index 26548f82..2db14a59 100644
--- a/core/src/main/java/tech/tablesaw/columns/numbers/filters/NotEqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/numbers/filters/NotEqualTo.java
@@ -36,8 +36,8 @@ public class NotEqualTo extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        NumberColumn numberColumn = (NumberColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        NumberColumn numberColumn = (NumberColumn) column;
         return numberColumn.isNotEqualTo(value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/StringMapFunctions.java b/core/src/main/java/tech/tablesaw/columns/strings/StringMapFunctions.java
index 1d071eb9..571963a9 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/StringMapFunctions.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/StringMapFunctions.java
@@ -274,75 +274,6 @@ public interface StringMapFunctions extends Column {
         return newColumn;
     }
 
-    default NumberColumn countTokens(String separator) {
-        NumberColumn newColumn = DoubleColumn.create(name() + "[token count]", this.size());
-
-        for (int r = 0; r < size(); r++) {
-            String value = getString(r);
-
-            Splitter splitter = Splitter.on(separator);
-            splitter = splitter.trimResults();
-            splitter = splitter.omitEmptyStrings();
-            List<String> tokens = new ArrayList<>(splitter.splitToList(value));
-            newColumn.append(tokens.size());
-        }
-        return newColumn;
-    }
-
-    /**
-     * Returns a column of arbitrary size containing each unique token in this column, where a token is defined using the
-     * given separator, and uniqueness is calculated across the entire column
-     *
-     * NOTE: Unlike other map functions, this method produces a column whose size may be different from the source,
-     * so they cannot safely be combined in a table.
-     *
-     * @param separator the delimiter used in the tokenizing operation
-     * @return          a new column
-     */
-    default StringColumn uniqueTokens(String separator) {
-        return tokens(separator).unique();
-    }
-
-    /**
-     * Returns a column of arbitrary size containing each token in this column, where a token is defined using the
-     * given separator.
-     *
-     * NOTE: Unlike other map functions, this method produces a column whose size may be different from the source,
-     * so they cannot safely be combined in a table.
-     *
-     * @param separator the delimiter used in the tokenizing operation
-     * @return          a new column
-     */
-    default StringColumn tokens(String separator) {
-        StringColumn newColumn = StringColumn.create(name() + "[token count]", this.size());
-
-        for (int r = 0; r < size(); r++) {
-            String value = getString(r);
-
-            Splitter splitter = Splitter.on(separator);
-            splitter = splitter.trimResults();
-            splitter = splitter.omitEmptyStrings();
-            List<String> tokens = new ArrayList<>(splitter.splitToList(value));
-            for (String token : tokens) {
-                newColumn.append(token);
-            }
-        }
-        return newColumn;
-    }
-
-    /**
-     * Returns a column containing the character length of each string in this column
-     * The returned column is the same size as the original
-     */
-    default NumberColumn length() {
-        NumberColumn newColumn = DoubleColumn.create(name() + "[length]", this.size());
-
-        for (int r = 0; r < size(); r++) {
-            newColumn.append(getString(r).length());
-        }
-        return newColumn;
-    }
-
     /**
      * Splits on Whitespace and returns the lexicographically sorted result.
      *
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnContainsString.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnContainsString.java
index 6f0e4996..0b9d1714 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnContainsString.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnContainsString.java
@@ -41,11 +41,11 @@ public class ColumnContainsString extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        StringColumn textColumn = (StringColumn) columnToFilter;
         return textColumn.eval(String::contains, (StringColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnEndsWith.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnEndsWith.java
index ac61001f..8360ffd7 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnEndsWith.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnEndsWith.java
@@ -41,11 +41,11 @@ public class ColumnEndsWith extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        StringColumn textColumn = (StringColumn) columnToFilter;
         return textColumn.eval(String::endsWith, (StringColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnEqualTo.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnEqualTo.java
index e055a441..5dcce5e7 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnEqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnEqualTo.java
@@ -43,11 +43,11 @@ public class ColumnEqualTo extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        StringColumn textColumn = (StringColumn) columnToFilter;
         return textColumn.eval(isEqualTo, (StringColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnEqualToIgnoringCase.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnEqualToIgnoringCase.java
index 8efeab78..e9e43893 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnEqualToIgnoringCase.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnEqualToIgnoringCase.java
@@ -43,11 +43,11 @@ public class ColumnEqualToIgnoringCase extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        StringColumn textColumn = (StringColumn) columnToFilter;
         return textColumn.eval(isEqualToIgnoringCase, (StringColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnNotEqualTo.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnNotEqualTo.java
index a586922e..09897215 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnNotEqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnNotEqualTo.java
@@ -43,11 +43,11 @@ public class ColumnNotEqualTo extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        StringColumn textColumn = (StringColumn) columnToFilter;
         return textColumn.eval(isNotEqualTo, (StringColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnStartsWith.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnStartsWith.java
index dac4e592..c0931c59 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnStartsWith.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/ColumnStartsWith.java
@@ -43,11 +43,11 @@ public class ColumnStartsWith extends TwoColumnFilter {
      * Returns a selection formed by applying a predicate for case-neutral equality between
      * each value in the given column and the corresponding value of the column passed into the constructor.
      *
-     * @param columnBeingFiltered The column whose results will be filtered by the operation
+     * @param columnToFilter The column whose results will be filtered by the operation
      */
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column columnToFilter) {
+        StringColumn textColumn = (StringColumn) columnToFilter;
         return textColumn.eval(startsWith, (StringColumn) otherColumn());
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/ContainsString.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/ContainsString.java
index 2ca59cdf..8e597768 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/ContainsString.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/ContainsString.java
@@ -44,8 +44,8 @@ public class ContainsString extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        StringColumn textColumn = (StringColumn) column;
         return textColumn.eval(stringContains, string);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/EndsWith.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/EndsWith.java
index cda4262f..2ed5e79c 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/EndsWith.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/EndsWith.java
@@ -44,8 +44,8 @@ public class EndsWith extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        StringColumn textColumn = (StringColumn) column;
         return textColumn.eval(endsWith, string);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/EqualTo.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/EqualTo.java
index 164e0ce2..a598d308 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/EqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/EqualTo.java
@@ -40,11 +40,11 @@ public class EqualTo extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case STRING: {
-                StringColumn stringColumn = (StringColumn) columnBeingFiltered;
+                StringColumn stringColumn = (StringColumn) column;
                 return stringColumn.isEqualTo(value);
             }
             default:
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/EqualToIgnoringCase.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/EqualToIgnoringCase.java
index c99e54b9..82f1f555 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/EqualToIgnoringCase.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/EqualToIgnoringCase.java
@@ -44,8 +44,8 @@ public class EqualToIgnoringCase extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        StringColumn textColumn = (StringColumn) column;
         return textColumn.eval(isEqualToIgnoringCase, string);
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/HasLengthEqualTo.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/HasLengthEqualTo.java
index d0c4492a..0287f1f5 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/HasLengthEqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/HasLengthEqualTo.java
@@ -45,8 +45,8 @@ public class HasLengthEqualTo extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        StringColumn textColumn = (StringColumn) column;
         return textColumn.eval(hasEqualLengthTo, length);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsAlpha.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsAlpha.java
index 386435b0..e067be96 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsAlpha.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsAlpha.java
@@ -41,8 +41,8 @@ public class IsAlpha extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        StringColumn textColumn = (StringColumn) column;
         return textColumn.eval(isAlpha);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsAlphaNumeric.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsAlphaNumeric.java
index ec418a8a..df30b0dc 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsAlphaNumeric.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsAlphaNumeric.java
@@ -41,8 +41,8 @@ public class IsAlphaNumeric extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        StringColumn textColumn = (StringColumn) column;
         return textColumn.eval(isAlphaNumeric);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsEmptyString.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsEmptyString.java
index b53b7505..ca7e1e23 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsEmptyString.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsEmptyString.java
@@ -41,8 +41,8 @@ public class IsEmptyString extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        StringColumn textColumn = (StringColumn) column;
         return textColumn.eval(isEmpty);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsIn.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsIn.java
index 79585781..54a8d332 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsIn.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsIn.java
@@ -45,8 +45,8 @@ public class IsIn extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn stringColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        StringColumn stringColumn = (StringColumn) column;
         return stringColumn.isIn(filters);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsLongerThan.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsLongerThan.java
index 2a2207e1..53233bd6 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsLongerThan.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsLongerThan.java
@@ -44,8 +44,8 @@ public class IsLongerThan extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        StringColumn textColumn = (StringColumn) column;
         return textColumn.eval(isLongerThan, length);
     }
 }
\ No newline at end of file
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsLowerCase.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsLowerCase.java
index f00fae63..4ecb239c 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsLowerCase.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsLowerCase.java
@@ -41,8 +41,8 @@ public class IsLowerCase extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        StringColumn textColumn = (StringColumn) column;
         return textColumn.eval(isLowerCase);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsNotIn.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsNotIn.java
index cf6d6de3..1c898a52 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsNotIn.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsNotIn.java
@@ -45,8 +45,8 @@ public class IsNotIn extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn stringColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        StringColumn stringColumn = (StringColumn) column;
         return stringColumn.isNotIn(filter);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsNumeric.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsNumeric.java
index a8d4f8e1..de2fef83 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsNumeric.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsNumeric.java
@@ -41,8 +41,8 @@ public class IsNumeric extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        StringColumn textColumn = (StringColumn) column;
         return textColumn.eval(isNumeric);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsShorterThan.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsShorterThan.java
index 6d25ee69..90aa1f3d 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsShorterThan.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsShorterThan.java
@@ -44,8 +44,8 @@ public class IsShorterThan extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        StringColumn textColumn = (StringColumn) column;
         return textColumn.eval(isShorterThan, length);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsUpperCase.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsUpperCase.java
index ad9bad66..14ce8236 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/IsUpperCase.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/IsUpperCase.java
@@ -41,8 +41,8 @@ public class IsUpperCase extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        StringColumn textColumn = (StringColumn) column;
         return textColumn.eval(isUpperCase);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/MatchesRegex.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/MatchesRegex.java
index 75ba3428..b055ebac 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/MatchesRegex.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/MatchesRegex.java
@@ -44,8 +44,8 @@ public class MatchesRegex extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        StringColumn textColumn = (StringColumn) column;
         return textColumn.eval(matchesRegex, string);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/NotEqualTo.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/NotEqualTo.java
index c2e09919..09fc930d 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/NotEqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/NotEqualTo.java
@@ -42,11 +42,11 @@ public class NotEqualTo extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case STRING: {
-                StringColumn stringColumn = (StringColumn) columnBeingFiltered;
+                StringColumn stringColumn = (StringColumn) column;
                 Selection selection = new BitmapBackedSelection();
                 selection.addRange(0, stringColumn.size());
                 selection.andNot(stringColumn.isEqualTo(value));
diff --git a/core/src/main/java/tech/tablesaw/columns/strings/filters/StartsWith.java b/core/src/main/java/tech/tablesaw/columns/strings/filters/StartsWith.java
index fc57e470..1d6f0a4e 100644
--- a/core/src/main/java/tech/tablesaw/columns/strings/filters/StartsWith.java
+++ b/core/src/main/java/tech/tablesaw/columns/strings/filters/StartsWith.java
@@ -44,8 +44,8 @@ public class StartsWith extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        StringColumn textColumn = (StringColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        StringColumn textColumn = (StringColumn) column;
         return textColumn.eval(startsWith, string);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/times/TimeFillers.java b/core/src/main/java/tech/tablesaw/columns/times/TimeFillers.java
new file mode 100644
index 00000000..a695bada
--- /dev/null
+++ b/core/src/main/java/tech/tablesaw/columns/times/TimeFillers.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tech.tablesaw.columns.times;
+
+import java.time.LocalTime;
+import java.util.Iterator;
+import java.util.function.Supplier;
+
+public interface TimeFillers<T> {
+
+    T fillWith(Iterator<LocalTime> iterator);
+
+    default T fillWith(Iterable<LocalTime> iterable) {
+        return fillWith(iterable.iterator());
+    }
+
+    T fillWith(Supplier<LocalTime> iterator);
+}
diff --git a/core/src/main/java/tech/tablesaw/columns/times/TimeMapFunctions.java b/core/src/main/java/tech/tablesaw/columns/times/TimeMapFunctions.java
index cca1384d..e9d52676 100644
--- a/core/src/main/java/tech/tablesaw/columns/times/TimeMapFunctions.java
+++ b/core/src/main/java/tech/tablesaw/columns/times/TimeMapFunctions.java
@@ -27,7 +27,7 @@ import java.time.temporal.ChronoUnit;
 import java.time.temporal.UnsupportedTemporalTypeException;
 
 import static java.time.temporal.ChronoUnit.*;
-import static tech.tablesaw.api.TimeColumn.MISSING_VALUE;
+import static tech.tablesaw.api.TimeColumn.*;
 
 public interface TimeMapFunctions extends Column {
 
diff --git a/core/src/main/java/tech/tablesaw/columns/times/filters/EqualTo.java b/core/src/main/java/tech/tablesaw/columns/times/filters/EqualTo.java
index 8bf5d0e2..b107c742 100644
--- a/core/src/main/java/tech/tablesaw/columns/times/filters/EqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/times/filters/EqualTo.java
@@ -38,8 +38,8 @@ public class EqualTo extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        TimeColumn dateColumn = (TimeColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        TimeColumn dateColumn = (TimeColumn) column;
         return dateColumn.isEqualTo(value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/times/filters/IsAfter.java b/core/src/main/java/tech/tablesaw/columns/times/filters/IsAfter.java
index 0514db5d..1ea97917 100644
--- a/core/src/main/java/tech/tablesaw/columns/times/filters/IsAfter.java
+++ b/core/src/main/java/tech/tablesaw/columns/times/filters/IsAfter.java
@@ -39,8 +39,8 @@ public class IsAfter extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        TimeColumn timeColumn = (TimeColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        TimeColumn timeColumn = (TimeColumn) column;
         return timeColumn.eval(PackedLocalTime::isAfter, PackedLocalTime.pack(value));
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/times/filters/IsAfterNoon.java b/core/src/main/java/tech/tablesaw/columns/times/filters/IsAfterNoon.java
index 5f3b22e4..e70010ef 100644
--- a/core/src/main/java/tech/tablesaw/columns/times/filters/IsAfterNoon.java
+++ b/core/src/main/java/tech/tablesaw/columns/times/filters/IsAfterNoon.java
@@ -39,14 +39,14 @@ public class IsAfterNoon extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_TIME:
-                TimeColumn timeColumn = (TimeColumn) columnBeingFiltered;
+                TimeColumn timeColumn = (TimeColumn) column;
                 return timeColumn.eval(PackedLocalTime::PM);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::PM);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/times/filters/IsBefore.java b/core/src/main/java/tech/tablesaw/columns/times/filters/IsBefore.java
index 62bc6737..c5fc5588 100644
--- a/core/src/main/java/tech/tablesaw/columns/times/filters/IsBefore.java
+++ b/core/src/main/java/tech/tablesaw/columns/times/filters/IsBefore.java
@@ -39,8 +39,8 @@ public class IsBefore extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        TimeColumn timeColumn = (TimeColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        TimeColumn timeColumn = (TimeColumn) column;
         return timeColumn.eval(PackedLocalTime::isBefore, PackedLocalTime.pack(value));
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/times/filters/IsBeforeNoon.java b/core/src/main/java/tech/tablesaw/columns/times/filters/IsBeforeNoon.java
index 4bf4ba97..bd5b9a92 100644
--- a/core/src/main/java/tech/tablesaw/columns/times/filters/IsBeforeNoon.java
+++ b/core/src/main/java/tech/tablesaw/columns/times/filters/IsBeforeNoon.java
@@ -39,14 +39,14 @@ public class IsBeforeNoon extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_TIME:
-                TimeColumn timeColumn = (TimeColumn) columnBeingFiltered;
+                TimeColumn timeColumn = (TimeColumn) column;
                 return timeColumn.eval(PackedLocalTime::AM);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::AM);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/times/filters/IsMidnight.java b/core/src/main/java/tech/tablesaw/columns/times/filters/IsMidnight.java
index 0af3793e..7548fc34 100644
--- a/core/src/main/java/tech/tablesaw/columns/times/filters/IsMidnight.java
+++ b/core/src/main/java/tech/tablesaw/columns/times/filters/IsMidnight.java
@@ -39,14 +39,14 @@ public class IsMidnight extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_TIME:
-                TimeColumn timeColumn = (TimeColumn) columnBeingFiltered;
+                TimeColumn timeColumn = (TimeColumn) column;
                 return timeColumn.eval(PackedLocalTime::isMidnight);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isMidnight);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/times/filters/IsNoon.java b/core/src/main/java/tech/tablesaw/columns/times/filters/IsNoon.java
index 6027e27d..2be64499 100644
--- a/core/src/main/java/tech/tablesaw/columns/times/filters/IsNoon.java
+++ b/core/src/main/java/tech/tablesaw/columns/times/filters/IsNoon.java
@@ -39,14 +39,14 @@ public class IsNoon extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        ColumnType type = columnBeingFiltered.type();
+    public Selection apply(Column column) {
+        ColumnType type = column.type();
         switch (type) {
             case LOCAL_TIME:
-                TimeColumn timeColumn = (TimeColumn) columnBeingFiltered;
+                TimeColumn timeColumn = (TimeColumn) column;
                 return timeColumn.eval(PackedLocalTime::isNoon);
             case LOCAL_DATE_TIME:
-                DateTimeColumn dateTimeColumn = (DateTimeColumn) columnBeingFiltered;
+                DateTimeColumn dateTimeColumn = (DateTimeColumn) column;
                 return dateTimeColumn.eval(PackedLocalDateTime::isNoon);
             default:
                 throw new UnsupportedOperationException("Columns of type " + type.name() + " do not support the operation "
diff --git a/core/src/main/java/tech/tablesaw/columns/times/filters/IsOnOrAfter.java b/core/src/main/java/tech/tablesaw/columns/times/filters/IsOnOrAfter.java
index 17f9d0b4..40cf85c3 100644
--- a/core/src/main/java/tech/tablesaw/columns/times/filters/IsOnOrAfter.java
+++ b/core/src/main/java/tech/tablesaw/columns/times/filters/IsOnOrAfter.java
@@ -50,8 +50,8 @@ public class IsOnOrAfter extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        TimeColumn timeColumn = (TimeColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        TimeColumn timeColumn = (TimeColumn) column;
         return timeColumn.eval(PackedLocalTime::isOnOrAfter, value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/times/filters/IsOnOrBefore.java b/core/src/main/java/tech/tablesaw/columns/times/filters/IsOnOrBefore.java
index 089254d3..251df2ef 100644
--- a/core/src/main/java/tech/tablesaw/columns/times/filters/IsOnOrBefore.java
+++ b/core/src/main/java/tech/tablesaw/columns/times/filters/IsOnOrBefore.java
@@ -50,8 +50,8 @@ public class IsOnOrBefore extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        TimeColumn timeColumn = (TimeColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        TimeColumn timeColumn = (TimeColumn) column;
         return timeColumn.eval(PackedLocalTime::isOnOrBefore, value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/columns/times/filters/NotEqualTo.java b/core/src/main/java/tech/tablesaw/columns/times/filters/NotEqualTo.java
index 9e6f7be9..d8ad886e 100644
--- a/core/src/main/java/tech/tablesaw/columns/times/filters/NotEqualTo.java
+++ b/core/src/main/java/tech/tablesaw/columns/times/filters/NotEqualTo.java
@@ -38,8 +38,8 @@ public class NotEqualTo extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        TimeColumn dateColumn = (TimeColumn) columnBeingFiltered;
+    public Selection apply(Column column) {
+        TimeColumn dateColumn = (TimeColumn) column;
         return dateColumn.isNotEqualTo(value);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/filtering/Filter.java b/core/src/main/java/tech/tablesaw/filtering/Filter.java
index f2159286..22d00664 100644
--- a/core/src/main/java/tech/tablesaw/filtering/Filter.java
+++ b/core/src/main/java/tech/tablesaw/filtering/Filter.java
@@ -8,11 +8,5 @@ public interface Filter {
 
     Selection apply(Table relation);
 
-    /**
-     * Returns a selection created by applying this filter (and any optional params added in extending classes) to the
-     * given column
-     * @param columnBeingFiltered
-     * @return
-     */
-    Selection apply(Column columnBeingFiltered);
+    Selection apply(Column column);
 }
diff --git a/core/src/main/java/tech/tablesaw/filtering/IsMissing.java b/core/src/main/java/tech/tablesaw/filtering/IsMissing.java
index 0165a31d..b6cc8d94 100644
--- a/core/src/main/java/tech/tablesaw/filtering/IsMissing.java
+++ b/core/src/main/java/tech/tablesaw/filtering/IsMissing.java
@@ -34,7 +34,7 @@ public class IsMissing extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        return columnBeingFiltered.isMissing();
+    public Selection apply(Column column) {
+        return column.isMissing();
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/filtering/IsNotMissing.java b/core/src/main/java/tech/tablesaw/filtering/IsNotMissing.java
index 298389ae..b080536a 100644
--- a/core/src/main/java/tech/tablesaw/filtering/IsNotMissing.java
+++ b/core/src/main/java/tech/tablesaw/filtering/IsNotMissing.java
@@ -34,7 +34,7 @@ public class IsNotMissing extends ColumnFilter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        return columnBeingFiltered.isNotMissing();
+    public Selection apply(Column column) {
+        return column.isNotMissing();
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/filtering/TwoColumnFilter.java b/core/src/main/java/tech/tablesaw/filtering/TwoColumnFilter.java
index 1ce280af..d5925f4c 100644
--- a/core/src/main/java/tech/tablesaw/filtering/TwoColumnFilter.java
+++ b/core/src/main/java/tech/tablesaw/filtering/TwoColumnFilter.java
@@ -75,9 +75,6 @@ public abstract class TwoColumnFilter implements Filter {
     }
 
     public Column otherColumn() {
-        Preconditions.checkNotNull(otherColumn, "Column references can only be used in multi-column filters " +
-                "when both columns are in the same table, and the apply(table) method is used.");
-
         return otherColumn;
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/filtering/composite/AllOf.java b/core/src/main/java/tech/tablesaw/filtering/composite/AllOf.java
index 9a42398b..bbfe1ace 100644
--- a/core/src/main/java/tech/tablesaw/filtering/composite/AllOf.java
+++ b/core/src/main/java/tech/tablesaw/filtering/composite/AllOf.java
@@ -58,13 +58,13 @@ public class AllOf implements Filter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
+    public Selection apply(Column column) {
         Selection selection = null;
         for (Filter filter : filterList) {
             if (selection == null) {
-                selection = filter.apply(columnBeingFiltered);
+                selection = filter.apply(column);
             } else {
-                selection.and(filter.apply(columnBeingFiltered));
+                selection.and(filter.apply(column));
             }
         }
         return selection;
diff --git a/core/src/main/java/tech/tablesaw/filtering/composite/AnyOf.java b/core/src/main/java/tech/tablesaw/filtering/composite/AnyOf.java
index dda0ee13..d25da07e 100644
--- a/core/src/main/java/tech/tablesaw/filtering/composite/AnyOf.java
+++ b/core/src/main/java/tech/tablesaw/filtering/composite/AnyOf.java
@@ -60,13 +60,13 @@ public class AnyOf implements Filter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
+    public Selection apply(Column column) {
         Selection selection = null;
         for (Filter filter : filterList) {
             if (selection == null) {
-                selection = filter.apply(columnBeingFiltered);
+                selection = filter.apply(column);
             } else {
-                selection.or(filter.apply(columnBeingFiltered));
+                selection.or(filter.apply(column));
             }
         }
         return selection;
diff --git a/core/src/main/java/tech/tablesaw/filtering/composite/IsFalse.java b/core/src/main/java/tech/tablesaw/filtering/composite/IsFalse.java
index 423273b4..017dda10 100644
--- a/core/src/main/java/tech/tablesaw/filtering/composite/IsFalse.java
+++ b/core/src/main/java/tech/tablesaw/filtering/composite/IsFalse.java
@@ -50,10 +50,10 @@ public class IsFalse implements Filter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
+    public Selection apply(Column column) {
         Selection selection = new BitmapBackedSelection();
-        selection.addRange(0, columnBeingFiltered.size());
-        selection.andNot(filter.apply(columnBeingFiltered));
+        selection.addRange(0, column.size());
+        selection.andNot(filter.apply(column));
         return selection;
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/filtering/composite/IsTrue.java b/core/src/main/java/tech/tablesaw/filtering/composite/IsTrue.java
index beab13a6..a04f7892 100644
--- a/core/src/main/java/tech/tablesaw/filtering/composite/IsTrue.java
+++ b/core/src/main/java/tech/tablesaw/filtering/composite/IsTrue.java
@@ -46,7 +46,7 @@ public class IsTrue implements Filter {
     }
 
     @Override
-    public Selection apply(Column columnBeingFiltered) {
-        return filter.apply(columnBeingFiltered);
+    public Selection apply(Column column) {
+        return filter.apply(column);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/selection/Selection.java b/core/src/main/java/tech/tablesaw/selection/Selection.java
index 6ac57032..1dc2cd89 100644
--- a/core/src/main/java/tech/tablesaw/selection/Selection.java
+++ b/core/src/main/java/tech/tablesaw/selection/Selection.java
@@ -115,7 +115,7 @@ public interface Selection extends IntIterable, Filter {
     }
 
     @Override
-    default Selection apply(Column columnBeingFiltered) {
+    default Selection apply(Column column) {
         return this;
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/sorting/comparators/DescendingIntegerComparator.java b/core/src/main/java/tech/tablesaw/sorting/comparators/DescendingIntegerComparator.java
new file mode 100644
index 00000000..06285d8e
--- /dev/null
+++ b/core/src/main/java/tech/tablesaw/sorting/comparators/DescendingIntegerComparator.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tech.tablesaw.sorting.comparators;
+
+import javax.annotation.concurrent.Immutable;
+import java.util.Comparator;
+
+/**
+ * A Comparator for sorting int primitives in descending order
+ */
+@Immutable
+public final class DescendingIntegerComparator {
+
+    private static final Comparator<Integer> reverseIntComparator = (o2, o1) -> (Integer.compare(o1, o2));
+
+    public static Comparator<Integer> instance() {
+        return reverseIntComparator;
+    }
+
+}
diff --git a/core/src/main/java/tech/tablesaw/sorting/comparators/IntComparatorChain.java b/core/src/main/java/tech/tablesaw/sorting/comparators/IntComparatorChain.java
index d89a3cd9..50590ee7 100644
--- a/core/src/main/java/tech/tablesaw/sorting/comparators/IntComparatorChain.java
+++ b/core/src/main/java/tech/tablesaw/sorting/comparators/IntComparatorChain.java
@@ -133,9 +133,13 @@ public class IntComparatorChain implements IntComparator, Serializable {
                         break label48;
                     }
                 }
-                return false;
+
+                var10000 = false;
+                return var10000;
             }
-            return true;
+
+            var10000 = true;
+            return var10000;
         }
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/sorting/comparators/StringComparator.java b/core/src/main/java/tech/tablesaw/sorting/comparators/StringComparator.java
new file mode 100644
index 00000000..25e64928
--- /dev/null
+++ b/core/src/main/java/tech/tablesaw/sorting/comparators/StringComparator.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package tech.tablesaw.sorting.comparators;
+
+public class StringComparator {
+
+    private static final StringComparator instance = new StringComparator();
+
+    private StringComparator() {
+    }
+
+    public static StringComparator getInstance() {
+        return instance;
+    }
+
+    public int compare(String a, String b) {
+        return a.compareTo(b);
+    }
+}
diff --git a/core/src/main/java/tech/tablesaw/table/Relation.java b/core/src/main/java/tech/tablesaw/table/Relation.java
index 016e2121..a3a3e807 100644
--- a/core/src/main/java/tech/tablesaw/table/Relation.java
+++ b/core/src/main/java/tech/tablesaw/table/Relation.java
@@ -14,7 +14,6 @@
 
 package tech.tablesaw.table;
 
-import it.unimi.dsi.fastutil.ints.IntArrays;
 import tech.tablesaw.api.BooleanColumn;
 import tech.tablesaw.api.CategoricalColumn;
 import tech.tablesaw.api.ColumnType;
@@ -27,10 +26,11 @@ import tech.tablesaw.api.Table;
 import tech.tablesaw.api.TimeColumn;
 import tech.tablesaw.columns.Column;
 import tech.tablesaw.io.string.DataFramePrinter;
-import tech.tablesaw.sorting.comparators.DescendingIntComparator;
+import tech.tablesaw.sorting.comparators.DescendingIntegerComparator;
 import tech.tablesaw.util.DoubleArrays;
 
 import java.io.ByteArrayOutputStream;
+import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -52,7 +52,8 @@ public abstract class Relation {
     }
 
     public Relation removeColumns(int ... columnIndexes) {
-        IntArrays.quickSort(columnIndexes, DescendingIntComparator.instance());
+        Arrays.sort(Arrays.stream(columnIndexes).boxed().toArray( Integer[]::new ),
+                DescendingIntegerComparator.instance());
         for (int i : columnIndexes) {
             removeColumns(column(i));
         }
@@ -338,7 +339,7 @@ public abstract class Relation {
         return null;
     }
 
-    public boolean containsColumn(Column column) {
+    public boolean containsColumn(CategoricalColumn column) {
         return columns().contains(column);
     }
 }
diff --git a/core/src/main/java/tech/tablesaw/table/StandardTableSliceGroup.java b/core/src/main/java/tech/tablesaw/table/StandardTableSliceGroup.java
index b72ce0d5..34e04b84 100644
--- a/core/src/main/java/tech/tablesaw/table/StandardTableSliceGroup.java
+++ b/core/src/main/java/tech/tablesaw/table/StandardTableSliceGroup.java
@@ -31,6 +31,13 @@ public class StandardTableSliceGroup extends TableSliceGroup {
 
     private StandardTableSliceGroup(Table original, CategoricalColumn... columns) {
         super(original, splitColumnNames(columns));
+
+        for (CategoricalColumn column: columns) {
+            if (!original.containsColumn(column)) {
+                columnsToRemove.add(column);
+                getSourceTable().addColumn(column);
+            }
+        }
         setSourceTable(getSourceTable().sortOn(getSplitColumnNames()));
         splitOn(getSplitColumnNames());
     }
@@ -49,7 +56,7 @@ public class StandardTableSliceGroup extends TableSliceGroup {
      */
     public static StandardTableSliceGroup create(Table original, String... columnsNames) {
         List<CategoricalColumn> columns = original.categoricalColumns(columnsNames);
-        return new StandardTableSliceGroup(original, columns.toArray(new CategoricalColumn[0]));
+        return new StandardTableSliceGroup(original, columns.toArray(new CategoricalColumn[columns.size()]));
     }
 
     /**
diff --git a/core/src/main/java/tech/tablesaw/table/TableSliceGroup.java b/core/src/main/java/tech/tablesaw/table/TableSliceGroup.java
index c6cd876a..536dbb86 100644
--- a/core/src/main/java/tech/tablesaw/table/TableSliceGroup.java
+++ b/core/src/main/java/tech/tablesaw/table/TableSliceGroup.java
@@ -20,6 +20,7 @@ import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Lists;
 import tech.tablesaw.aggregate.AggregateFunction;
+import tech.tablesaw.api.CategoricalColumn;
 import tech.tablesaw.api.DoubleColumn;
 import tech.tablesaw.api.NumberColumn;
 import tech.tablesaw.api.StringColumn;
@@ -46,6 +47,9 @@ public class TableSliceGroup implements Iterable<TableSlice> {
     // The list of slices or views over the source table that I contain
     private final List<TableSlice> subTables = new ArrayList<>();
 
+    // Grouping columns that were calculated on the fly, rather than being in the source. We remove when we're done.
+    final List<CategoricalColumn> columnsToRemove = new ArrayList<>();
+
     private final String[] splitColumnNames;
 
     // The table that underlies all the manipulations performed here
@@ -139,7 +143,12 @@ public class TableSliceGroup implements Iterable<TableSlice> {
     public Table aggregate(String colName1, AggregateFunction... functions) {
         ArrayListMultimap<String, AggregateFunction> columnFunctionMap = ArrayListMultimap.create();
         columnFunctionMap.putAll(colName1, Lists.newArrayList(functions));
-        return aggregate(columnFunctionMap);
+
+        Table result = aggregate(columnFunctionMap);
+        for (CategoricalColumn column : columnsToRemove) {
+            result.removeColumns(column);
+        }
+        return result;
     }
 
     /**
@@ -170,7 +179,11 @@ public class TableSliceGroup implements Iterable<TableSlice> {
                 functionCount++;
             }
         }
-        return splitGroupingColumn(groupTable);
+        Table result = splitGroupingColumn(groupTable);
+        for (CategoricalColumn column : columnsToRemove) {
+            result.removeColumns(column);
+        }
+        return result;
     }
 
     public static Table summaryTableName(Table source) {
diff --git a/core/src/main/java/tech/tablesaw/util/DoubleArrays.java b/core/src/main/java/tech/tablesaw/util/DoubleArrays.java
index b4e3a1ab..1e9a9115 100644
--- a/core/src/main/java/tech/tablesaw/util/DoubleArrays.java
+++ b/core/src/main/java/tech/tablesaw/util/DoubleArrays.java
@@ -27,9 +27,6 @@ import java.util.List;
  */
 public class DoubleArrays {
 
-    /**
-     * Returns a double[] initialized with the values from 0 to n-1, inclusive;
-     */
     public static double[] toN(int n) {
         double[] result = new double[n];
         for (int i = 0; i < n; i++) {
@@ -46,6 +43,7 @@ public class DoubleArrays {
         for (int r = 0; r < obs; r++) {
             for (int c = 0; c < columns.length; c++) {
                 allVals[r][c] = columns[c].getDouble(r);
+                allVals[r][c] = columns[c].getDouble(r);
             }
         }
         return allVals;
diff --git a/docs/changes_in_v_0.2.md b/docs/changes_in_v_0.2.md
index 8d9e6d2c..d7e40154 100644
--- a/docs/changes_in_v_0.2.md
+++ b/docs/changes_in_v_0.2.md
@@ -2,7 +2,7 @@
 
 ### Testing & Documentation
 
-1. Increased test coverage from 44% in core, to 76%.
+1. Increased test coverage from 44% in core, to 74%.
 
 ### Removed:
 
@@ -82,46 +82,35 @@
 1. Extended PackedLocalTime and PackedLocalDate to be (approximately) functionally equivalent to Java's LocalDate and LocalTime.
 
 1. Improved Aggregation/Summarization
-    1. Support for conditional summarization using *summarizeIf()*. The code below counts the number of strings in column that end with "3". 
-
-       ```java
-       double count = column.summarizeIf(column.endsWith("3"), count);
-       ```
-
-    1. Simplified the CrossTab API, and provided methods for creating CrossTabs (a  ka contingency tables) in table objects:
+    1. Simplified the CrossTab API, and made CrossTabs accessible from table objects:
 
        ```java
        table.xTabCounts("columnA", "columnB");
        ```
 
-    1. Support for table summaries that include summaries of columns created on the fly using mapping functions:
-
-       ```java
-       table.summarize(dateColumn.year(), max, min);
-       ```
-
     1. Support for table summaries that include non-numeric columns. For example, the code below applies *countTrue* to the boolean column and *standardDeviation* to the numeric column.
 
        ```java
-       table.summarize(booleanColumn, numberColumn, countTrue, standardDeviation); 
+       table.summarize(booleanColumn, numberColumn, 
+                       countTrue, standardDeviation).by(stringColumn); 
        ```
 
-    1. Support summarizing *by* "time windows" groups of n time units (days, weeks, years, etc).
+    1. Support summarizing by "time windows" groups of n time units (days, weeks, years, etc).
 
        ```java
        table.summarize("quantity", mean, median).by(date.timeWindow(DAYS, 5));
        ```
 
-    1. Support summarizing *by* named time units (months, for example):
+    1. Support summarizing by named time units (months, for example):
 
        ```java
        table.summarize("quantity", mean, median).by(date.month());
        ```
 
-    1. Both of the above are examples of a more general solution: Sub totals can per calculated for groups defined *by* any function that returns a column: 
+    1. Both of the above are examples of a more general solution: Sub totals can per calculated for groups defined by any function that returns a column: 
 
        ```java
-       table.summarize("quantity", sumOfSquares).by(strCol.substring(4, 7));
+       summarize("quantity", sumOfSquares).by(strCol.substring(4, 7));
        ```
 
        ​
diff --git a/docs/userguide/columns.md b/docs/userguide/columns.md
index 43c2e3ff..ca7e549b 100644
--- a/docs/userguide/columns.md
+++ b/docs/userguide/columns.md
@@ -1,41 +1,25 @@
 Columns
 =======
 
-Tablesaw is all about tables and tables are made of columns. To truly understand your data, you'll often need to work with a single column. Tablesaw provides a large collection of tools for that, and we'll cover the basics here. Each column type also has its own section that goes into greater detail. 
-
-Let's start with a definition. A column is a named vector of data, all of a single type. Some elements may be missing, and it's important to deal with those. We show how to do that in a little bit. 
-
+Tablesaw is all about tables, of course, but tables are made of columns, and you often need to work with a single column.
+ A column is a vector of data, all of a single type. Some elements of the vector may be missing, and it's important to
+  deal with those. We show how to do that here. 
+  
 Here are the supported column types:
 
-* Boolean, or true and false values
-* String, as in "Hello, World," or "RN183-15F";
-* Number 
-* Date: A "local date". That is, a date without a timezone. April 10, 2018, for example.
-* DateTime: A local date and time combined. April 10, 2018 at 9:07.
-* Time: A local time, like 12:47:03
-
-There is currently one specific type of number column, called DoubleColumn. As you'd expect, it holds 8-byte floating point numbers. 
+* Boolean
+* String 
+* Number (8 byte floating point)
+* Local Date
+* Local DateTime
+* Local Time
 
-We'll begin by looking at the operations that are common to all column types. 
+All column types support a common set of operations, and a set specific to its type. 
+We'll begin by looking at the common operations. 
 
 #### Create a Column
 
-Columns are usually created by calling one of the static create() methods defined on the class. For example, you can create an empty date column as follows:
-
-```Java
-DateColumn column = DateColumn.create("test");
-```
-
-The new column has the name "test", and a ColumnType of LOCAL_DATE. Names are important. We often refer to a column by its name, so we don't have to declare a variable to access it. All the columns within a given table must have unique names. You can always get the name of a column by calling *name()*, and its type by calling *type()*.
-
-To create a column with data, you will generally read the data from a file or database, but you can also initialize the column with an array:
-
-```Java
-double[] values = {1, 2, 3, 7, 9.44242, 11};
-DoubleColumn column = DoubleColumn.create("my numbers", values);
-```
-
-Once you have a column, 
+    DateColumn column = DateColumn.create("test");
 
 #### Add an element to the end of the column
 
@@ -51,27 +35,25 @@ Save a column as a CSV
 
 Columns do all the things you expect, here’s an incomplete list of standard operations:
 
-```Java
-size()                          // returns the number of elements
-isEmpty()                       // returns true if column has no data; false otherwise
-first() and last()              // returns the first and last elements, respectively
-first(n) and last(n)            // returns the first and last n elements
-max() and min()                 // returns the largest and smallest elements
-top(n) and bottom(n)            // returns the n largest and smallest elements
-name()                          // returns the name of the column
-type()                          // returns the ColumnType, e.g. LOCAL_DATE
-print()                         // returns a String representation of the column
-copy()						 	// returns a deep copy of the column
-emptyCopy()						// returns a column of the same type and name, but no data
-unique()
-countUnique()
-asSet()
-summary()
-void sortAscending()			// sorts the column in ascending order 
-void sortDescending()			// sorts the column in ascending order 
-Column append(value)            // Appends a single value 
-append(Column)                  // Appends the data in other column to this one
-```
+    size()                           // returns the number of elements
+    isEmpty()                        // returns true if column has no data; false otherwise
+    first() and last()               // returns the first and last elements, respectively
+    first(n) and last(n)             // returns the first and last n elements
+    max() and min()                  // returns the largest and smallest elements
+    top(n) and bottom(n)             // returns the n largest and smallest elements
+    name()                           // returns the name of the column
+    type()                           // returns the ColumnType, e.g. LOCAL_DATE
+    print()                          // returns a String representation of the column
+    copy()
+    emptyCopy()
+    unique()
+    countUnique()
+    asSet()
+    summary()
+    sortAscending()
+    sortDescending()
+    append(value)                   // Appends a single value 
+    append(Column)                  // Appends the data in other column to this one
 
 These operations are available on nearly all column types, including date columns. Each operates on an entire column. 
 To operate on the values of a column, you have two choices. You can work with individual values, or use column-wise operations to work with all the values in a column in the same way. To work with individual values, you can just iterate over the column:
@@ -102,7 +84,7 @@ You can filter a date column using #selectIf(IntPredicate).  For example, if you
         return i.isAfter(date);
       }
     };
-
+    
 which you can use as:
 
     DateColumn filtered = dates.selectIf(after_2_28);
@@ -114,7 +96,7 @@ There are numerous built-in date predicates. For example:
     DateColumn filtered = dates.isMonday();
     DateColumn filtered = dates.isInQ2();
     DateColumn filtered = dates.isLastDayOfTheMonth();
-
+    
 You can find a full list in the JavaDoc for DateColumn.
 
 ### Grouping


Test patch:
diff --git a/core/src/test/java/tech/tablesaw/aggregate/AggregateFunctionsTest.java b/core/src/test/java/tech/tablesaw/aggregate/AggregateFunctionsTest.java
index 3caa7fb4..c1ccc377 100644
--- a/core/src/test/java/tech/tablesaw/aggregate/AggregateFunctionsTest.java
+++ b/core/src/test/java/tech/tablesaw/aggregate/AggregateFunctionsTest.java
@@ -29,7 +29,6 @@ import tech.tablesaw.table.TableSliceGroup;
 import tech.tablesaw.io.csv.CsvReadOptions;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 import static tech.tablesaw.aggregate.AggregateFunctions.*;
 
 public class AggregateFunctionsTest {
@@ -83,14 +82,6 @@ public class AggregateFunctionsTest {
         assertEquals("2.5099800796022267", result.get(0, 2));
     }
 
-    @Test
-    public void testSummaryWithACalculatedColumn() {
-        Summarizer summarizer = new Summarizer(table, table.dateColumn("date").year(), mean);
-        Table t = summarizer.apply();
-        double avg = t.numberColumn(0).get(0);
-        assertTrue(avg > 2002 && avg < 2003);
-    }
-
     @Test
     public void test2ColumnGroupMean() {
         CategoricalColumn byColumn1 = table.stringColumn("who");
@@ -144,7 +135,7 @@ public class AggregateFunctionsTest {
 
         Table table = Table.create("test", booleanColumn, numberColumn, stringColumn);
         Table summarized = table.summarize(booleanColumn, numberColumn, countTrue, standardDeviation).apply();
-        assertEquals(1.2909944487358056, summarized.numberColumn(1).get(0), 0.00001);
+        System.out.println(summarized);
     }
 
     @Test
diff --git a/core/src/test/java/tech/tablesaw/api/BooleanColumnTest.java b/core/src/test/java/tech/tablesaw/api/BooleanColumnTest.java
index 3ef4bc01..fd41f529 100644
--- a/core/src/test/java/tech/tablesaw/api/BooleanColumnTest.java
+++ b/core/src/test/java/tech/tablesaw/api/BooleanColumnTest.java
@@ -38,45 +38,6 @@ public class BooleanColumnTest {
         column.append(false);
     }
 
-    @Test
-    public void testAny() {
-        assertTrue(column.any());
-    }
-
-    @Test
-    public void testAll() {
-        assertFalse(column.all());
-        BooleanColumn filtered = column.where(column.isTrue());
-        assertTrue(filtered.all());
-    }
-
-    @Test
-    public void testNone() {
-        assertFalse(column.none());
-        BooleanColumn filtered = column.where(column.isFalse());
-        assertTrue(filtered.none());
-    }
-
-    @Test
-    public void testSet() {
-        assertFalse(column.none());
-        column.set(false, column.isTrue());
-        assertTrue(column.none());
-    }
-
-    @Test
-    public void testGetDouble() {
-        assertEquals(1, column.getDouble(4), 0.0);
-        assertEquals(0, column.getDouble(0), 0.0);
-    }
-
-    @Test
-    public void testAppendColumn() {
-        BooleanColumn column1 = column.copy();
-        column1.append(column);
-        assertEquals(2 * column.size(), column1.size());
-    }
-
     @Test
     public void testPrinting() {
         column.appendCell("");
diff --git a/core/src/test/java/tech/tablesaw/api/NumberColumnTest.java b/core/src/test/java/tech/tablesaw/api/NumberColumnTest.java
index c55ccc44..57a67e1b 100644
--- a/core/src/test/java/tech/tablesaw/api/NumberColumnTest.java
+++ b/core/src/test/java/tech/tablesaw/api/NumberColumnTest.java
@@ -22,7 +22,6 @@ import org.apache.commons.math3.stat.StatUtils;
 import org.apache.commons.math3.stat.correlation.KendallsCorrelation;
 import org.apache.commons.math3.stat.correlation.PearsonsCorrelation;
 import org.apache.commons.math3.stat.correlation.SpearmansCorrelation;
-import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
 import org.junit.Ignore;
 import org.junit.Test;
 import tech.tablesaw.columns.numbers.NumberColumnFormatter;
@@ -35,7 +34,6 @@ import java.util.concurrent.TimeUnit;
 
 import static java.lang.Double.NaN;
 import static org.junit.Assert.*;
-import static tech.tablesaw.aggregate.AggregateFunctions.*;
 
 /**
  * Unit tests for the NumberColumn class
@@ -68,61 +66,6 @@ public class NumberColumnTest {
         System.out.println("Search time in ms = " + stopwatch.elapsed(TimeUnit.MILLISECONDS));
     }
 
-    @Test
-    public void testPercentiles() {
-        NumberColumn c = DoubleColumn.indexColumn("t", 99, 1);
-        NumberColumn c2 = c.copy();
-        c2.appendCell("");
-        assertEquals(50, c.median(), 0.00001);
-        assertEquals(50, c2.median(), 0.00001);
-        assertEquals(50, median.summarize(c), 0.00001);
-
-        assertEquals(25, c.quartile1(), 0.00001);
-        assertEquals(25, c2.quartile1(), 0.00001);
-        assertEquals(25, quartile1.summarize(c), 0.00001);
-
-        assertEquals(75, c.quartile3(), 0.00001);
-        assertEquals(75, c2.quartile3(), 0.00001);
-        assertEquals(75, quartile3.summarize(c), 0.00001);
-
-        assertEquals(90, percentile90.summarize(c), 0.00001);
-
-        assertEquals(5, c2.percentile(5), 0.00001);
-        assertEquals(5, c.percentile(5), 0.00001);
-        assertEquals(5, percentile(c, 5), 0.00001);
-
-        assertEquals(95, percentile95.summarize(c), 0.00001);
-        assertEquals(99, percentile99.summarize(c), 0.00001);
-    }
-
-    @Test
-    public void testSummarize() {
-        NumberColumn c = DoubleColumn.indexColumn("t", 99, 1);
-        NumberColumn c2 = c.copy();
-        c2.appendCell("");
-        assertEquals(StatUtils.variance(c.asDoubleArray()), c2.variance(), 0.00001);
-        assertEquals(StatUtils.sumLog(c.asDoubleArray()), c2.sumOfLogs(), 0.00001);
-        assertEquals(StatUtils.sumSq(c.asDoubleArray()), c2.sumOfSquares(), 0.00001);
-        assertEquals(StatUtils.geometricMean(c.asDoubleArray()), c2.geometricMean(), 0.00001);
-        assertEquals(StatUtils.product(c.asDoubleArray()), c2.product(), 0.00001);
-        assertEquals(StatUtils.populationVariance(c.asDoubleArray()), c2.populationVariance(), 0.00001);
-        assertEquals(new DescriptiveStatistics(c.asDoubleArray()).getQuadraticMean(), c2.quadraticMean(), 0.00001);
-        assertEquals(new DescriptiveStatistics(c.asDoubleArray()).getStandardDeviation(), c2.standardDeviation(), 0.00001);
-        assertEquals(new DescriptiveStatistics(c.asDoubleArray()).getKurtosis(), c2.kurtosis(), 0.00001);
-        assertEquals(new DescriptiveStatistics(c.asDoubleArray()).getSkewness(), c2.skewness(), 0.00001);
-
-        assertEquals(StatUtils.variance(c.asDoubleArray()), c.variance(), 0.00001);
-        assertEquals(StatUtils.sumLog(c.asDoubleArray()), c.sumOfLogs(), 0.00001);
-        assertEquals(StatUtils.sumSq(c.asDoubleArray()), c.sumOfSquares(), 0.00001);
-        assertEquals(StatUtils.geometricMean(c.asDoubleArray()), c.geometricMean(), 0.00001);
-        assertEquals(StatUtils.product(c.asDoubleArray()), c.product(), 0.00001);
-        assertEquals(StatUtils.populationVariance(c.asDoubleArray()), c.populationVariance(), 0.00001);
-        assertEquals(new DescriptiveStatistics(c.asDoubleArray()).getQuadraticMean(), c.quadraticMean(), 0.00001);
-        assertEquals(new DescriptiveStatistics(c.asDoubleArray()).getStandardDeviation(), c.standardDeviation(), 0.00001);
-        assertEquals(new DescriptiveStatistics(c.asDoubleArray()).getKurtosis(), c.kurtosis(), 0.00001);
-        assertEquals(new DescriptiveStatistics(c.asDoubleArray()).getSkewness(), c.skewness(), 0.00001);
-    }
-
     @Ignore
     @Test
     public void testSortAndApplyFilter1() {
diff --git a/core/src/test/java/tech/tablesaw/api/QueryHelperTest.java b/core/src/test/java/tech/tablesaw/api/QueryHelperTest.java
index 8b6b54a5..bbd2d0e3 100644
--- a/core/src/test/java/tech/tablesaw/api/QueryHelperTest.java
+++ b/core/src/test/java/tech/tablesaw/api/QueryHelperTest.java
@@ -27,6 +27,7 @@ public class QueryHelperTest {
                 )
         );
         assertTrue(result.get(0, "who").startsWith("f"));
+        System.out.println(result);
     }
 
     @Test
@@ -38,6 +39,8 @@ public class QueryHelperTest {
         result = t.where(
                         stringColumn("who").isNotIn("fox", "zogby"));
         assertFalse(result.get(0, "who").startsWith("f"));
+
+        System.out.println(result);
     }
 
     @Test
diff --git a/core/src/test/java/tech/tablesaw/api/StringColumnTest.java b/core/src/test/java/tech/tablesaw/api/StringColumnTest.java
index 2b38ef01..3283435e 100644
--- a/core/src/test/java/tech/tablesaw/api/StringColumnTest.java
+++ b/core/src/test/java/tech/tablesaw/api/StringColumnTest.java
@@ -14,19 +14,19 @@
 
 package tech.tablesaw.api;
 
+import tech.tablesaw.columns.strings.StringColumnFormatter;
+import tech.tablesaw.selection.Selection;
+
 import org.junit.Before;
 import org.junit.Test;
 import tech.tablesaw.TestDataUtil;
-import tech.tablesaw.columns.strings.StringColumnFormatter;
-import tech.tablesaw.selection.Selection;
 
 import java.util.List;
 import java.util.function.Function;
 
-import static org.junit.Assert.*;
-import static tech.tablesaw.aggregate.AggregateFunctions.count;
 import static tech.tablesaw.api.QueryHelper.both;
 import static tech.tablesaw.columns.strings.StringPredicates.isEqualToIgnoringCase;
+import static org.junit.Assert.*;
 
 public class StringColumnTest {
 
@@ -40,17 +40,6 @@ public class StringColumnTest {
         column.append("Value 4");
     }
 
-    @Test
-    public void testSummarizeIf() {
-        double result = column.summarizeIf(
-                column.endsWith("3").or(column.endsWith("4")),
-                count);
-        assertEquals(2, result, 0.0);
-
-        double result2 = column.summarizeIf(column.endsWith("3"), count);
-        assertEquals(1, result2, 0.0);
-    }
-
     @Test
     public void testConditionalSet() {
         column.set("no Value", column.isEqualTo("Value 4"));
@@ -202,9 +191,11 @@ public class StringColumnTest {
         assertTrue(other.contains("Some other thing"));
         assertTrue(other.contains("VALUE 3"));
         assertTrue(other.contains("Value 4"));
+        assertTrue("Value 3".equalsIgnoreCase("VALUE 3"));
         assertEquals(4, other.size());
         StringColumn result = (StringColumn) column.subset(column.eval(isEqualToIgnoringCase, other));
         assertEquals(3, result.size());
+        System.out.println(result);
     }
 
     @Test
diff --git a/core/src/test/java/tech/tablesaw/api/TableTest.java b/core/src/test/java/tech/tablesaw/api/TableTest.java
index 15b4ec42..9f6a5767 100644
--- a/core/src/test/java/tech/tablesaw/api/TableTest.java
+++ b/core/src/test/java/tech/tablesaw/api/TableTest.java
@@ -62,21 +62,6 @@ public class TableTest {
         assertNotNull(column1);
     }
 
-    @Test
-    public void testRemoveColumns() {
-        StringColumn sc = StringColumn.create("0");
-        StringColumn sc1 = StringColumn.create("1");
-        StringColumn sc2 = StringColumn.create("2");
-        StringColumn sc3 = StringColumn.create("3");
-        Table t = Table.create("t", sc, sc1, sc2, sc3);
-        t.removeColumns(1, 3);
-        assertTrue(t.containsColumn(sc));
-        assertTrue(t.containsColumn(sc2));
-        assertFalse(t.containsColumn(sc1));
-        assertFalse(t.containsColumn(sc3));
-
-    }
-
     @Test
     public void printEmptyTable() {
         Table t = Table.create("Test");
@@ -93,7 +78,7 @@ public class TableTest {
         Column c2 = DoubleColumn.create("NC");
         Column c3 = DateColumn.create("DC");
         Table t = Table.create("Test", c1, c2, c3);
-        assertEquals(0, t.missingValueCounts().numberColumn(1).get(0), 0.00001);
+        System.out.println(t.missingValueCounts());
     }
 
     @Test
@@ -147,6 +132,7 @@ public class TableTest {
     @Test
     public void testDoWithEachRow() throws Exception {
         Table t = Table.read().csv("../data/bush.csv").first(10);
+        System.out.println(t.print());
         Table.Doable doable = new Table.Doable() {
 
             @Override
@@ -154,7 +140,7 @@ public class TableTest {
                 if (row.getRowNumber() < 5) {
                     System.out.println("On "
                             + row.getPackedDate("date")
-                            + ", low rating: "
+                            + ", his approval sucks: "
                             + row.getDouble("approval"));
                 }
             }
diff --git a/core/src/test/java/tech/tablesaw/columns/booleans/BooleanFillersTest.java b/core/src/test/java/tech/tablesaw/columns/booleans/BooleanFillersTest.java
new file mode 100644
index 00000000..37fb8740
--- /dev/null
+++ b/core/src/test/java/tech/tablesaw/columns/booleans/BooleanFillersTest.java
@@ -0,0 +1,26 @@
+package tech.tablesaw.columns.booleans;
+
+import static org.junit.Assert.assertEquals;
+import static tech.tablesaw.api.BooleanColumn.create;
+import static tech.tablesaw.columns.booleans.fillers.BooleanIterable.bits;
+
+import org.junit.Test;
+
+import it.unimi.dsi.fastutil.booleans.BooleanIterable;
+
+public class BooleanFillersTest {
+
+    protected void testValues(BooleanIterable booleans, boolean... expected) {
+        int num = 0;
+        for (boolean value : booleans) {
+            assertEquals(expected[num], value);
+            num++;
+        }
+        assertEquals(expected.length, num);
+    }
+
+    @Test
+    public void test() {
+        testValues(create("booleans", new boolean[5]).fillWith(bits(0b110, 3)), true, true, false, true, true);
+    }
+}
diff --git a/core/src/test/java/tech/tablesaw/columns/dates/DateFillersTest.java b/core/src/test/java/tech/tablesaw/columns/dates/DateFillersTest.java
new file mode 100644
index 00000000..e4087d28
--- /dev/null
+++ b/core/src/test/java/tech/tablesaw/columns/dates/DateFillersTest.java
@@ -0,0 +1,32 @@
+package tech.tablesaw.columns.dates;
+
+import static org.junit.Assert.assertEquals;
+import static tech.tablesaw.api.DateColumn.createWith;
+import static tech.tablesaw.columns.datetimes.fillers.TemporalRangeIterable.range;
+
+import java.time.LocalDate;
+import java.time.temporal.ChronoUnit;
+
+import org.junit.Test;
+
+public class DateFillersTest {
+
+    protected void testValues(Iterable<LocalDate> times, LocalDate... expected) {
+        int num = 0;
+        for (LocalDate value : times) {
+            assertEquals(expected[num], value);
+            num++;
+        }
+        assertEquals(expected.length, num);
+    }
+
+    @Test
+    public void testFromToBy() {
+        testValues(createWith("dates", 5, range(LocalDate.of(2018, 3, 1), // year, month, day
+                LocalDate.of(2019, 3, 1), 1, ChronoUnit.DAYS)), LocalDate.of(2018, 3, 1), // year, month, day
+                LocalDate.of(2018, 3, 2), LocalDate.of(2018, 3, 3), LocalDate.of(2018, 3, 4), LocalDate.of(2018, 3, 5));
+        testValues(createWith("dates", 5, range(LocalDate.of(2018, 3, 1), // year, month, day
+                LocalDate.of(2019, 3, 1), 1, ChronoUnit.MONTHS)), LocalDate.of(2018, 3, 1), // year, month, day
+                LocalDate.of(2018, 4, 1), LocalDate.of(2018, 5, 1), LocalDate.of(2018, 6, 1), LocalDate.of(2018, 7, 1));
+    }
+}
diff --git a/core/src/test/java/tech/tablesaw/columns/dates/DateFiltersTest.java b/core/src/test/java/tech/tablesaw/columns/dates/DateFiltersTest.java
index e4c26afd..122126c0 100644
--- a/core/src/test/java/tech/tablesaw/columns/dates/DateFiltersTest.java
+++ b/core/src/test/java/tech/tablesaw/columns/dates/DateFiltersTest.java
@@ -202,8 +202,8 @@ public class DateFiltersTest {
         int before = minusDays(1, packed);
         int after = plusDays(1, packed);
 
-        LocalDate beforeDate = asLocalDate(before);
-        LocalDate afterDate = asLocalDate(after);
+        LocalDate beforeDate = PackedLocalDate.asLocalDate(before);
+        LocalDate afterDate = PackedLocalDate.asLocalDate(after);
 
         dateColumn.appendInternal(before);
         dateColumn.appendInternal(packed);
diff --git a/core/src/test/java/tech/tablesaw/columns/dates/PackedLocalDateTest.java b/core/src/test/java/tech/tablesaw/columns/dates/PackedLocalDateTest.java
index 1428deda..82e95ae5 100644
--- a/core/src/test/java/tech/tablesaw/columns/dates/PackedLocalDateTest.java
+++ b/core/src/test/java/tech/tablesaw/columns/dates/PackedLocalDateTest.java
@@ -234,7 +234,6 @@ public class PackedLocalDateTest {
                 case 9: assertTrue(isInOctober(date)); break;
                 case 10: assertTrue(isInNovember(date)); break;
                 case 11: assertTrue(isInDecember(date)); break;
-                default: throw new IllegalArgumentException("Can't have a month outside this range");
             }
             date = plusMonths(1, date);
         }
diff --git a/core/src/test/java/tech/tablesaw/columns/datetimes/DateTimeFillersTest.java b/core/src/test/java/tech/tablesaw/columns/datetimes/DateTimeFillersTest.java
new file mode 100644
index 00000000..541f47c5
--- /dev/null
+++ b/core/src/test/java/tech/tablesaw/columns/datetimes/DateTimeFillersTest.java
@@ -0,0 +1,53 @@
+package tech.tablesaw.columns.datetimes;
+
+import static org.junit.Assert.assertEquals;
+import static tech.tablesaw.api.DateTimeColumn.createWith;
+import static tech.tablesaw.columns.datetimes.fillers.TemporalRangeIterable.range;
+
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+
+import org.junit.Test;
+
+public class DateTimeFillersTest {
+
+    protected void testValues(Iterable<LocalDateTime> times, LocalDateTime... expected) {
+        int num = 0;
+        for (LocalDateTime value : times) {
+            assertEquals(expected[num], value);
+            num++;
+        }
+        assertEquals(expected.length, num);
+    }
+
+    @Test
+    public void testFromToBy() {
+        testValues(createWith("datetimes", 5, range(LocalDateTime.of(2018, 3, 1, 12, 30), // year, month, day, hour,
+                                                                                          // minute
+                LocalDateTime.of(2019, 3, 1, 12, 30), 1, ChronoUnit.DAYS)), LocalDateTime.of(2018, 3, 1, 12, 30), // year,
+                                                                                                                  // month,
+                                                                                                                  // day,
+                                                                                                                  // hour,
+                                                                                                                  // minute
+                LocalDateTime.of(2018, 3, 2, 12, 30), LocalDateTime.of(2018, 3, 3, 12, 30),
+                LocalDateTime.of(2018, 3, 4, 12, 30), LocalDateTime.of(2018, 3, 5, 12, 30));
+        testValues(createWith("datetimes", 5, range(LocalDateTime.of(2018, 3, 1, 12, 30), // year, month, day, hour,
+                                                                                          // minute
+                LocalDateTime.of(2019, 3, 1, 12, 30), 1, ChronoUnit.MONTHS)), LocalDateTime.of(2018, 3, 1, 12, 30), // year,
+                                                                                                                    // month,
+                                                                                                                    // day,
+                                                                                                                    // hour,
+                                                                                                                    // minute
+                LocalDateTime.of(2018, 4, 1, 12, 30), LocalDateTime.of(2018, 5, 1, 12, 30),
+                LocalDateTime.of(2018, 6, 1, 12, 30), LocalDateTime.of(2018, 7, 1, 12, 30));
+        testValues(createWith("datetimes", 5, range(LocalDateTime.of(2018, 3, 1, 12, 30), // year, month, day, hour,
+                                                                                          // minute
+                LocalDateTime.of(2019, 3, 1, 12, 30), 2, ChronoUnit.HOURS)), LocalDateTime.of(2018, 3, 1, 12, 30), // year,
+                                                                                                                   // month,
+                                                                                                                   // day,
+                                                                                                                   // hour,
+                                                                                                                   // minute
+                LocalDateTime.of(2018, 3, 1, 14, 30), LocalDateTime.of(2018, 3, 1, 16, 30),
+                LocalDateTime.of(2018, 3, 1, 18, 30), LocalDateTime.of(2018, 3, 1, 20, 30));
+    }
+}
diff --git a/core/src/test/java/tech/tablesaw/columns/numbers/NumberFillersTest.java b/core/src/test/java/tech/tablesaw/columns/numbers/NumberFillersTest.java
new file mode 100644
index 00000000..59e5ff4e
--- /dev/null
+++ b/core/src/test/java/tech/tablesaw/columns/numbers/NumberFillersTest.java
@@ -0,0 +1,43 @@
+package tech.tablesaw.columns.numbers;
+
+import static org.junit.Assert.assertEquals;
+import static tech.tablesaw.api.DoubleColumn.create;
+import static tech.tablesaw.columns.numbers.fillers.DoubleRangeIterable.range;
+
+import org.junit.Test;
+
+public class NumberFillersTest {
+
+    protected void testValues(Iterable<Double> doubles, double... expected) {
+        int num = 0;
+        for (double value : doubles) {
+            assertEquals(expected[num], value, 0.0000001);
+            num++;
+        }
+        assertEquals(expected.length, num);
+    }
+
+    @Test
+    public void testFromToBy() {
+        testValues(create("doubles", new double[5]).fillWith(range(1.0, 12.0, 2.5)), 1.0, 3.5, 6.0, 8.5, 11.0);
+        testValues(create("doubles", new double[5]).fillWith(range(1.0, 7.0, 2.5)), 1.0, 3.5, 6.0, 1.0, 3.5);
+    }
+
+    @Test
+    public void testFromTo() {
+        testValues(create("doubles", new double[5]).fillWith(range(1.0, 6.0)), 1.0, 2.0, 3.0, 4.0, 5.0);
+        testValues(create("doubles", new double[5]).fillWith(range(1.0, 4.0)), 1.0, 2.0, 3.0, 1.0, 2.0);
+    }
+
+    @Test
+    public void testFromByCount() {
+        testValues(create("doubles", new double[5]).fillWith(range(1.0, 2.5, 5)), 1.0, 3.5, 6.0, 8.5, 11.0);
+        testValues(create("doubles", new double[5]).fillWith(range(1.0, 2.5, 3)), 1.0, 3.5, 6.0, 1.0, 3.5);
+    }
+
+    @Test
+    public void testFromCount() {
+        testValues(create("doubles", new double[5]).fillWith(range(1.0, 5)), 1.0, 2.0, 3.0, 4.0, 5.0);
+        testValues(create("doubles", new double[5]).fillWith(range(1.0, 3)), 1.0, 2.0, 3.0, 1.0, 2.0);
+    }
+}
diff --git a/core/src/test/java/tech/tablesaw/columns/numbers/NumberFiltersTest.java b/core/src/test/java/tech/tablesaw/columns/numbers/NumberFiltersTest.java
index 6848df70..dad8e13f 100644
--- a/core/src/test/java/tech/tablesaw/columns/numbers/NumberFiltersTest.java
+++ b/core/src/test/java/tech/tablesaw/columns/numbers/NumberFiltersTest.java
@@ -3,11 +3,10 @@ package tech.tablesaw.columns.numbers;
 import org.junit.Test;
 import tech.tablesaw.api.DoubleColumn;
 import tech.tablesaw.api.NumberColumn;
-import tech.tablesaw.api.Table;
+import tech.tablesaw.columns.numbers.NumberColumnReference;
 import tech.tablesaw.selection.Selection;
 
-import static java.lang.Double.NaN;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
 
 public class NumberFiltersTest {
 
@@ -72,47 +71,21 @@ public class NumberFiltersTest {
     @Test
     public void testIsGreaterThanOrEqualTo() {
         double[] values = {4, 0, -0.00001};
-        double[] otherValues = {4, -1.3, 0.00001, NaN};
-
         NumberColumn doubles =  DoubleColumn.create("doubles", values);
-        NumberColumnReference reference = new NumberColumnReference(doubles.name());
-
         Selection selection = doubles.isGreaterThanOrEqualTo(0.0);
         assertEquals(0, selection.get(0));
         assertEquals(1, selection.get(1));
         assertEquals(2, selection.size());
-
-        NumberColumn others = DoubleColumn.create("others", otherValues);
-        NumberColumnReference otherReference = new NumberColumnReference(others.name());
-
-        Table table = Table.create("test", doubles, others);
-        Selection selection1 = reference.isGreaterThanOrEqualTo(otherReference).apply(table);
-        assertEquals(0, selection1.get(0));
-        assertEquals(1, selection1.get(1));
-        assertEquals(2, selection1.size());
     }
 
     @Test
     public void testIsLessThanOrEqualTo() {
         double[] values = {4, 0, -0.00001};
-        double[] otherValues = {4, -1.3, 0.00001, NaN};
-
         NumberColumn doubles =  DoubleColumn.create("doubles", values);
-        NumberColumnReference reference = new NumberColumnReference(doubles.name());
-
         Selection selection = doubles.isLessThanOrEqualTo(0.0);
         assertEquals(1, selection.get(0));
         assertEquals(2, selection.get(1));
         assertEquals(2, selection.size());
-
-        NumberColumn others = DoubleColumn.create("others", otherValues);
-        NumberColumnReference otherReference = new NumberColumnReference(others.name());
-
-        Table table = Table.create("test", doubles, others);
-        Selection selection1 = reference.isLessThanOrEqualTo(otherReference).apply(table);
-        assertEquals(0, selection1.get(0));
-        assertEquals(2, selection1.get(1));
-        assertEquals(2, selection1.size());
     }
 
     @Test
@@ -129,25 +102,13 @@ public class NumberFiltersTest {
 
     @Test
     public void testIsGreaterThan() {
-
         double[] values = {4, 0, -0.00001, 5.0};
-        double[] otherValues = {4, -1.3, 0.00001, NaN};
-
         NumberColumn doubles =  DoubleColumn.create("doubles", values);
         NumberColumnReference reference = new NumberColumnReference(doubles.name());
-
         Selection selection = reference.isGreaterThan(0).apply(doubles);
         assertEquals(0, selection.get(0));
         assertEquals(3, selection.get(1));
         assertEquals(2, selection.size());
-
-        NumberColumn others = DoubleColumn.create("others", otherValues);
-        NumberColumnReference otherReference = new NumberColumnReference(others.name());
-
-        Table table = Table.create("test", doubles, others);
-        Selection selection1 = reference.isGreaterThan(otherReference).apply(table);
-        assertEquals(1, selection1.get(0));
-        assertEquals(1, selection1.size());
     }
 
     @Test
@@ -174,14 +135,5 @@ public class NumberFiltersTest {
         assertEquals(2, selection.get(1));
         assertEquals(3, selection.get(2));
         assertEquals(3, selection.size());
-
-        NumberColumnReference otherReference = new NumberColumnReference(doubles2.name());
-
-        Table table = Table.create("test", doubles, doubles2);
-        Selection selection1 = reference.isNotEqualTo(otherReference).apply(table);
-        assertEquals(1, selection1.get(0));
-        assertEquals(2, selection1.get(1));
-        assertEquals(3, selection1.get(2));
-        assertEquals(3, selection1.size());
     }
 }
diff --git a/core/src/test/java/tech/tablesaw/columns/strings/StringFiltersTest.java b/core/src/test/java/tech/tablesaw/columns/strings/StringFiltersTest.java
index 06472aa5..d6282836 100644
--- a/core/src/test/java/tech/tablesaw/columns/strings/StringFiltersTest.java
+++ b/core/src/test/java/tech/tablesaw/columns/strings/StringFiltersTest.java
@@ -17,7 +17,6 @@ package tech.tablesaw.columns.strings;
 import com.google.common.collect.Lists;
 import org.junit.Before;
 import org.junit.Test;
-import tech.tablesaw.api.NumberColumn;
 import tech.tablesaw.api.StringColumn;
 import tech.tablesaw.api.Table;
 
@@ -82,30 +81,6 @@ public class StringFiltersTest {
         table.addColumn(sc2);
     }
 
-    @Test
-    public void testLength() {
-        assertEquals(5, sc1.length().get(0), 0.000001);
-    }
-
-    @Test
-    public void testUniqueTokens() {
-        String[] values = {"a", "a b", "c d 3", "b 4"};
-        StringColumn column1 = StringColumn.create("1", values);
-        StringColumn tokens = column1.tokens(" ");
-        assertEquals(8, tokens.size(), 0.0001);
-        StringColumn uniqueTokens = column1.uniqueTokens(" ");
-        assertEquals(6, uniqueTokens.size(), 0.000001);
-    }
-
-    @Test
-    public void testCountOccurrences() {
-        String[] values = {"a", "a b", "c d 3", "b 4", "a"};
-        StringColumn column1 = StringColumn.create("1", values);
-        assertEquals(0, column1.countOccurrences("v"), 0.000001);
-        assertEquals(1, column1.countOccurrences("b 4"), 0.000001);
-        assertEquals(2, column1.countOccurrences("a"), 0.000001);
-    }
-
     @Test
     public void testEqualsIgnoreCase() {
         assertTrue(sc1.equalsIgnoreCase("APPLE").contains(0));
@@ -356,12 +331,4 @@ public class StringFiltersTest {
         assertFalse(ref1.isNotEqualTo(ref2).apply(table).contains(9));
         assertTrue(ref1.isNotEqualTo(ref2).apply(table).contains(0));
     }
-
-    @Test
-    public void testCountWords() {
-        final String[] words1 = {"one", "two words"};
-        final StringColumn stringColumn1 = StringColumn.create("words", words1);
-        NumberColumn nc = stringColumn1.countTokens(" ");
-        assertEquals( 3, nc.sum(), 0.00001);
-    }
 }
diff --git a/core/src/test/java/tech/tablesaw/columns/times/TimeFillersTest.java b/core/src/test/java/tech/tablesaw/columns/times/TimeFillersTest.java
new file mode 100644
index 00000000..255b4ae3
--- /dev/null
+++ b/core/src/test/java/tech/tablesaw/columns/times/TimeFillersTest.java
@@ -0,0 +1,29 @@
+package tech.tablesaw.columns.times;
+
+import static org.junit.Assert.assertEquals;
+import static tech.tablesaw.api.TimeColumn.createWith;
+import static tech.tablesaw.columns.datetimes.fillers.TemporalRangeIterable.range;
+
+import java.time.LocalTime;
+import java.time.temporal.ChronoUnit;
+
+import org.junit.Test;
+
+public class TimeFillersTest {
+
+    protected void testValues(Iterable<LocalTime> times, LocalTime... expected) {
+        int num = 0;
+        for (LocalTime value : times) {
+            assertEquals(expected[num], value);
+            num++;
+        }
+        assertEquals(expected.length, num);
+    }
+
+    @Test
+    public void testFromToBy() {
+        testValues(createWith("times", 5, range(LocalTime.of(12, 30), // hour, minute
+                LocalTime.of(21, 30), 2, ChronoUnit.HOURS)), LocalTime.of(12, 30), // year, month, day, hour, minute
+                LocalTime.of(14, 30), LocalTime.of(16, 30), LocalTime.of(18, 30), LocalTime.of(20, 30));
+    }
+}
diff --git a/core/src/test/java/tech/tablesaw/index/IntIndexTest.java b/core/src/test/java/tech/tablesaw/index/IntIndexTest.java
index b8d90edc..d9aadb0a 100644
--- a/core/src/test/java/tech/tablesaw/index/IntIndexTest.java
+++ b/core/src/test/java/tech/tablesaw/index/IntIndexTest.java
@@ -14,19 +14,20 @@
 
 package tech.tablesaw.index;
 
+import tech.tablesaw.columns.DateAndTimePredicates;
+import tech.tablesaw.columns.numbers.NumberPredicates;
 import org.junit.Before;
 import org.junit.Test;
 import tech.tablesaw.api.ColumnType;
 import tech.tablesaw.api.Table;
-import tech.tablesaw.columns.DateAndTimePredicates;
 import tech.tablesaw.columns.dates.PackedLocalDate;
-import tech.tablesaw.columns.numbers.NumberPredicates;
 import tech.tablesaw.io.csv.CsvReadOptions;
 import tech.tablesaw.selection.Selection;
 
 import java.time.LocalDate;
 
-import static org.junit.Assert.*;
+import static tech.tablesaw.columns.numbers.NumberPredicates.isEqualTo;
+import static org.junit.Assert.assertEquals;
 
 /**
  *
@@ -52,7 +53,7 @@ public class IntIndexTest {
 
     @Test
     public void testGet() {
-        Selection fromCol = table.numberColumn("approval").eval(NumberPredicates.isEqualTo, 71);
+        Selection fromCol = table.numberColumn("approval").eval(isEqualTo, 71);
         Selection fromIdx = index.get(71);
         assertEquals(fromCol, fromIdx);
     }
@@ -63,9 +64,7 @@ public class IntIndexTest {
         int packedDate = PackedLocalDate.pack(date);
         Selection fromCol = table.dateColumn("date").eval(DateAndTimePredicates.isEqualTo, packedDate);
         Selection fromIdx = dateIndex.get(packedDate);
-        Selection fromIdx1 = dateIndex.get(date);
         assertEquals(fromCol, fromIdx);
-        assertEquals(fromCol, fromIdx1);
     }
 
     @Test
@@ -104,36 +103,4 @@ public class IntIndexTest {
         Selection fromIdx = index.greaterThan(71);
         assertEquals(fromCol, fromIdx);
     }
-
-    @Test
-    public void testGT1() {
-        LocalDate date = LocalDate.of(2002, 4, 1);
-        int value = PackedLocalDate.pack(date);
-        Selection fromCol = table.dateColumn("date").eval(DateAndTimePredicates.isGreaterThan, value);
-        Selection fromIdx = dateIndex.greaterThan(value);
-        Selection fromIdx1 = dateIndex.greaterThan(date);
-        assertEquals(fromCol, fromIdx);
-        assertEquals(fromCol, fromIdx1);
-    }
-
-    @Test
-    public void testLT1() {
-        LocalDate date = LocalDate.of(2002, 4, 1);
-        int value = PackedLocalDate.pack(date);
-        Selection fromCol = table.dateColumn("date").eval(DateAndTimePredicates.isLessThan, value);
-        Selection fromIdx = dateIndex.lessThan(value);
-        assertEquals(fromCol, fromIdx);
-    }
-
-    @Test
-    public void testAtMost() {
-        LocalDate date = LocalDate.of(2002, 4, 1);
-        int value = PackedLocalDate.pack(date);
-        Selection fromCol = table.dateColumn("date").eval(DateAndTimePredicates.isLessThanOrEqualTo, value);
-        Selection fromIdx = dateIndex.atMost(value);
-        Selection fromIdx1 = dateIndex.atMost(date);
-        assertFalse(fromIdx.isEmpty());
-        assertEquals(fromCol, fromIdx);
-        assertEquals(fromCol, fromIdx1);
-    }
 }
\ No newline at end of file
diff --git a/core/src/test/java/tech/tablesaw/io/DataFrameWriterTest.java b/core/src/test/java/tech/tablesaw/io/DataFrameWriterTest.java
deleted file mode 100644
index 7399c091..00000000
--- a/core/src/test/java/tech/tablesaw/io/DataFrameWriterTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package tech.tablesaw.io;
-
-import org.junit.Test;
-import tech.tablesaw.api.DoubleColumn;
-import tech.tablesaw.api.Table;
-
-import java.io.ByteArrayOutputStream;
-import java.io.OutputStreamWriter;
-
-import static java.lang.Double.NaN;
-import static org.junit.Assert.assertEquals;
-
-public class DataFrameWriterTest {
-
-    private double[] v1 = {1, 2, 3, 4, 5, NaN};
-    private double[] v2 = {1, 2, 3, 4, 5, NaN};
-    private Table table = Table.create("t",
-            DoubleColumn.create("v", v1),
-            DoubleColumn.create("v2", v2)
-    );
-
-    @Test
-    public void csv() throws Exception {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        table.write().csv(baos);
-        String output = baos.toString();
-        assertEquals("v,v2\n" +
-                "1.0,1.0\n" +
-                "2.0,2.0\n" +
-                "3.0,3.0\n" +
-                "4.0,4.0\n" +
-                "5.0,5.0\n" +
-                ",\n" +
-                "", output);
-    }
-
-    @Test
-    public void csv2() throws Exception {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        OutputStreamWriter osw = new OutputStreamWriter(baos);
-        table.write().csv(osw);
-        String output = baos.toString();
-        assertEquals("v,v2\n" +
-                "1.0,1.0\n" +
-                "2.0,2.0\n" +
-                "3.0,3.0\n" +
-                "4.0,4.0\n" +
-                "5.0,5.0\n" +
-                ",\n" +
-                "", output);
-    }
-
-    @Test
-    public void html() {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        table.write().html(baos);
-        String output = baos.toString();
-        assertEquals("<thead>\n" +
-                "<tr><th>v</th><th>v 2</th></tr>\n" +
-                "</thead>\n" +
-                "<tbody>\n" +
-                "<tr><td>1.0</td><td>1.0</td></tr>\n" +
-                "<tr><td>2.0</td><td>2.0</td></tr>\n" +
-                "<tr><td>3.0</td><td>3.0</td></tr>\n" +
-                "<tr><td>4.0</td><td>4.0</td></tr>\n" +
-                "<tr><td>5.0</td><td>5.0</td></tr>\n" +
-                "<tr><td></td><td></td></tr>\n" +
-                "</tbody>\n", output);
-    }
-}
\ No newline at end of file
diff --git a/core/src/test/java/tech/tablesaw/table/RollingColumnTest.java b/core/src/test/java/tech/tablesaw/table/RollingColumnTest.java
index 8808475d..42c35bd3 100644
--- a/core/src/test/java/tech/tablesaw/table/RollingColumnTest.java
+++ b/core/src/test/java/tech/tablesaw/table/RollingColumnTest.java
@@ -17,5 +17,7 @@ public class RollingColumnTest {
         NumberColumn result = DoubleColumn.create("data", data).rolling(5).mean();
         assertArrayEquals(sma5, result.asDoubleArray(), 0.000001);
         Assert.assertEquals("dataMean5", result.name());
+        System.out.println(result.print());
     }
+
 }
diff --git a/core/src/test/java/tech/tablesaw/util/DoubleArraysTest.java b/core/src/test/java/tech/tablesaw/util/DoubleArraysTest.java
index 76c5dbc1..bd8bcf6c 100644
--- a/core/src/test/java/tech/tablesaw/util/DoubleArraysTest.java
+++ b/core/src/test/java/tech/tablesaw/util/DoubleArraysTest.java
@@ -14,18 +14,10 @@
 
 package tech.tablesaw.util;
 
-import com.google.common.collect.Lists;
 import org.junit.Test;
-import tech.tablesaw.api.DoubleColumn;
 import tech.tablesaw.api.Table;
-import tech.tablesaw.columns.Column;
 import tech.tablesaw.table.TableSliceGroup;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import static org.junit.Assert.assertTrue;
-
 /**
  *
  */
@@ -38,47 +30,4 @@ public class DoubleArraysTest {
         int columnNuumber = table.columnIndex("Injuries");
         DoubleArrays.to2dArray(tableSliceGroup, columnNuumber);
     }
-
-    @Test
-    public void testToN() {
-        double[] array = {0, 1, 2};
-        assertTrue(Arrays.equals(array, DoubleArrays.toN(3)));
-    }
-
-    @Test
-    public void testTo2DArray2() {
-        double[] array1 = {0, 1, 2};
-        double[] array2 = {0, 1, 2};
-
-        double[][] expected = {{0.0, 0.0}, {1.0, 1.0}, {2.0, 2.0}};
-        double[][] results = DoubleArrays.to2dArray(array1, array2);
-        assertTrue(Arrays.deepEquals(expected, results));
-    }
-
-    @Test
-    public void testTo2DArray3() {
-        double[] array1 = {0, 1, 2};
-        double[] array2 = {0, 1, 2};
-
-        DoubleColumn c1 = DoubleColumn.create("1", array1);
-        DoubleColumn c2 = DoubleColumn.create("2", array2);
-
-        double[][] expected = {{0.0, 0.0}, {1.0, 1.0}, {2.0, 2.0}};
-        double[][] results = DoubleArrays.to2dArray(c1, c2);
-        assertTrue(Arrays.deepEquals(expected, results));
-    }
-
-    @Test
-    public void testTo2DArray4() {
-        double[] array1 = {0, 1, 2};
-        double[] array2 = {0, 1, 2};
-
-        DoubleColumn c1 = DoubleColumn.create("1", array1);
-        DoubleColumn c2 = DoubleColumn.create("2", array2);
-        ArrayList<Column> columnArrayList = Lists.newArrayList(c1, c2);
-
-        double[][] expected = {{0.0, 0.0}, {1.0, 1.0}, {2.0, 2.0}};
-        double[][] results = DoubleArrays.to2dArray(columnArrayList);
-        assertTrue(Arrays.deepEquals(expected, results));
-    }
 }
\ No newline at end of file