Documentation Index
Fetch the complete documentation index at: https://mintlify.com/amcharts/amcharts5/llms.txt
Use this file to discover all available pages before exploring further.
Overview
The DataProcessor class provides automatic data transformation capabilities. It can convert string values to dates, numbers, colors, and handle empty values - all before the data is used by chart components.
Basic Usage
Create a DataProcessor instance and assign it to your data:
import { DataProcessor } from "@amcharts/amcharts5";
import * as am5xy from "@amcharts/amcharts5/xy";
const series = chart.series.push(am5xy.LineSeries.new(root, {
xAxis: xAxis,
yAxis: yAxis,
valueYField: "value",
valueXField: "date"
}));
// Create data processor
const processor = DataProcessor.new(root, {
dateFields: ["date"],
dateFormat: "yyyy-MM-dd",
numericFields: ["value"]
});
// Assign to series data
series.data.processor = processor;
// Data will be automatically processed
series.data.setAll([
{ date: "2023-01-01", value: "100" }, // Strings will be converted
{ date: "2023-01-02", value: "150" },
{ date: "2023-01-03", value: "120" }
]);
Configuration
The DataProcessor accepts an IDataProcessorSettings object:
interface IDataProcessorSettings {
/**
* Date format used for parsing string-based dates.
*/
dateFormat?: string;
/**
* A list of fields in data that need to be converted to timestamps.
*/
dateFields?: string[];
/**
* A list of fields in data that need to be converted to numbers.
*/
numericFields?: string[];
/**
* A list of fields in data that need to be converted to Color objects.
*/
colorFields?: string[];
/**
* Replace empty values with this.
*/
emptyAs?: any;
}
Converting Date Strings
Convert string dates to timestamps:
const processor = DataProcessor.new(root, {
dateFields: ["date", "timestamp", "created"],
dateFormat: "yyyy-MM-dd HH:mm:ss"
});
series.data.processor = processor;
series.data.setAll([
{ date: "2023-01-01 14:30:00", value: 100 },
{ date: "2023-01-02 15:45:00", value: 150 }
]);
// Dates are converted to timestamps (milliseconds)
The processor uses the root’s DateFormatter for parsing. Common patterns:
yyyy - Full year (e.g., 2023)
MM - Month as number (01-12)
dd - Day of month (01-31)
HH - Hour in 24-hour format (00-23)
mm - Minutes (00-59)
ss - Seconds (00-59)
// ISO 8601 format
dateFormat: "yyyy-MM-dd'T'HH:mm:ss"
// US format
dateFormat: "MM/dd/yyyy"
// European format
dateFormat: "dd.MM.yyyy"
Converting Numeric Strings
Convert string numbers to numeric values:
const processor = DataProcessor.new(root, {
numericFields: ["value", "sales", "profit", "quantity"]
});
series.data.processor = processor;
series.data.setAll([
{ date: 1609459200000, value: "100", sales: "1,234.56" },
{ date: 1609545600000, value: "150", sales: "2,345.67" }
]);
// Strings are converted to numbers
The processor uses $type.toNumber() which handles:
- Integer strings:
"100" → 100
- Float strings:
"123.45" → 123.45
- Strings with commas:
"1,234.56" → 1234.56
- Invalid values:
"abc" → NaN
Converting Color Strings
Convert color strings to Color objects:
const processor = DataProcessor.new(root, {
colorFields: ["color", "fillColor", "strokeColor"]
});
series.data.processor = processor;
series.data.setAll([
{ category: "A", value: 100, color: "#ff0000" },
{ category: "B", value: 150, color: "rgb(0, 255, 0)" },
{ category: "C", value: 120, color: "blue" }
]);
// Color strings are converted to Color objects
Supported color formats:
- Hex:
"#ff0000", "#f00"
- RGB:
"rgb(255, 0, 0)"
- RGBA:
"rgba(255, 0, 0, 0.5)"
- Named colors:
"red", "blue", "green"
Handling Empty Values
Replace empty or null values with a default:
const processor = DataProcessor.new(root, {
numericFields: ["value"],
emptyAs: 0 // Replace empty values with 0
});
series.data.processor = processor;
series.data.setAll([
{ date: 1609459200000, value: 100 },
{ date: 1609545600000, value: null }, // → 0
{ date: 1609632000000, value: "" }, // → 0
{ date: 1609718400000, value: undefined } // → 0
]);
The emptyAs setting replaces:
null values
undefined values
- Empty strings (
"")
Processing Nested Fields
The processor supports dot notation for nested objects:
const processor = DataProcessor.new(root, {
dateFields: ["info.timestamp"],
numericFields: ["metrics.value", "metrics.count"],
colorFields: ["style.color"]
});
series.data.processor = processor;
series.data.setAll([
{
info: { timestamp: "2023-01-01" },
metrics: { value: "100", count: "50" },
style: { color: "#ff0000" }
}
]);
// Nested fields are processed recursively
Manual Processing
You can also process data manually without attaching to a component:
Processing a Single Row
const processor = DataProcessor.new(root, {
dateFields: ["date"],
dateFormat: "yyyy-MM-dd",
numericFields: ["value"]
});
const row = { date: "2023-01-01", value: "100" };
processor.processRow(row);
// row is modified in place:
// { date: 1672531200000, value: 100 }
Processing Multiple Rows
const data = [
{ date: "2023-01-01", value: "100" },
{ date: "2023-01-02", value: "150" }
];
processor.processMany(data);
// data array is modified in place
series.data.setAll(data);
The processRow() and processMany() methods modify the original data objects. Make a copy if you need to preserve the original data.
Automatic Processing with ListData
When a processor is assigned to data.processor, all data operations are automatically processed:
series.data.processor = processor;
// All these operations trigger processing:
series.data.setAll([...]); // All items processed
series.data.push({...}); // Single item processed
series.data.insertIndex(0, {}) // Single item processed
series.data.setIndex(5, {}) // Single item processed
The ListData class (which extends List) automatically calls processor.processRow() for new items:
Combining with Parsers
Data processors work well with CSV/JSON parsers:
import { CSVParser, DataProcessor } from "@amcharts/amcharts5";
// Load CSV data
const response = await am5.net.load("data.csv");
const data = CSVParser.parse(response.response, {
useColumnNames: true
});
// Create processor
const processor = DataProcessor.new(root, {
dateFields: ["date"],
dateFormat: "yyyy-MM-dd",
numericFields: ["value", "sales", "profit"]
});
// Process before setting
processor.processMany(data);
series.data.setAll(data);
// Or attach to data for automatic processing
series.data.processor = processor;
series.data.setAll(data); // Automatically processed
When to Use DataProcessor
Use a DataProcessor when:
- Loading data from CSV files (all values are strings)
- Receiving data from APIs with string values
- Working with user-uploaded data
- You need consistent data type conversion
When to Skip DataProcessor
Skip the processor for better performance when:
- Your data already has correct types
- Working with very large datasets (millions of rows)
- You’re handling type conversion manually
// Good: Data already has correct types
series.data.setAll([
{ date: 1609459200000, value: 100 }, // timestamp and number
{ date: 1609545600000, value: 150 }
]);
// No processor needed
Disabling Features
Only enable the features you need:
// Only process dates (more efficient)
const processor = DataProcessor.new(root, {
dateFields: ["date"],
dateFormat: "yyyy-MM-dd"
// No numericFields, colorFields, or emptyAs
});
Updating Processor Settings
You can modify processor settings after creation:
const processor = DataProcessor.new(root, {
dateFields: ["date"],
dateFormat: "yyyy-MM-dd"
});
series.data.processor = processor;
// Later, add numeric field processing
processor.set("numericFields", ["value", "sales"]);
// Change date format
processor.set("dateFormat", "MM/dd/yyyy");