Cómo obtener datos de intervalo de tiempo de org.json. ¿JSONArray en Java?
Tengo abajo los datos:
[{
"DT": "2020-12-18 09:20:00",
"High": 1432.15,
"Open": 1425.8
}, {
"DT": "2020-12-18 09:25:00",
"High": 1425,
"Open": 1424
}, {
"DT": "2020-12-18 09:30:00",
"High": 1423.1,
"Open": 1423.1
}, {
"DT": "2020-12-18 09:35:00",
"High": 1421.1,
"Open": 1419.15
}, {
"DT": "2020-12-18 09:40:00",
"High": 1420.85,
"Open": 1418.7
}, {
"DT": "2020-12-18 09:45:00",
"High": 1418.9,
"Open": 1415.85
}, {
"DT": "2020-12-18 09:50:00",
"High": 1418.9,
"Open": 1418.5
}]
pero quiero datos como:
por intervalo de 10 minutos :
[{
"DT": "2020-12-18 09:20:00",
"High": 1432.15,
"Open": 1425.8
}, {
"DT": "2020-12-18 09:30:00",
"High": 1423.1,
"Open": 1423.1
}, {
"DT": "2020-12-18 09:40:00",
"High": 1420.85,
"Open": 1418.7
}, {
"DT": "2020-12-18 09:50:00",
"High": 1418.9,
"Open": 1418.5
}]
por intervalo de 15 minutos
[{
"DT": "2020-12-18 09:20:00",
"High": 1432.15,
"Open": 1425.8
},{
"DT": "2020-12-18 09:35:00",
"High": 1421.1,
"Open": 1419.15
}, {
"DT": "2020-12-18 09:50:00",
"High": 1418.9,
"Open": 1418.5
}]
Pregunta hecha hace 3 años, 4 meses, 27 días - Por coderchampion
3 Respuestas:
-
Java 8 y superior
Crear los métodos a continuación y llamar
JSONArray tenMinutesArray = filterData( originalJSONArray, 10 );
private static JSONArray filterData( JSONArray values, int interval ) { JSONArray newArray = new JSONArray(); newArray.put( values.getJSONObject( 0 ) ); LocalDateTime start = parseDate( values.getJSONObject( 0 ).getString( "DT" ) ); for ( int i = 1; i < values.length(); i++ ) { JSONObject entry = values.getJSONObject( i ); LocalDateTime dt = parseDate( entry.getString( "DT" ) ); int diff = dt.minusMinutes( start.getMinute() ).getMinute(); if ( diff % interval == 0 ) { newArray.put( entry ); } } return newArray; } private static LocalDateTime parseDate( String dateTime ) { return LocalDateTime.parse( dateTime.replaceAll( " ", "T" ) ); }
Java 7 y más viejo
Esto es más fácil de hacer con Joda-Time.
Añadir la dependencia a tu
nodo en tu pom.xml:joda-time joda-time 2.10.8 Copiar los métodos a continuación y llamar
JSONArray tenMinutesArray = filterData( originalJSONArray, 10 );
con la cantidad de minutos que desea establecer como intervalo.private static JSONArray filterData( JSONArray values, int interval ) { JSONArray newArray = new JSONArray(); DateTime start = parseDate( values.getJSONObject( 0 ).getString( "DT" ) ); newArray.put( values.getJSONObject( 0 ) ); for ( int i = 1; i < values.length(); i++ ) { JSONObject entry = values.getJSONObject( i ); DateTime dt = parseDate( entry.getString( "DT" ) ); Minutes diff = Minutes.minutesBetween( start, dt ); if ( diff.getMinutes() % interval == 0 ) { newArray.put( entry ); } } return newArray; } private static DateTime parseDate( String dateTime ) { return DateTime.parse( ( dateTime + "Z" ).replaceAll( " 0?", "T" ) ); }
Respondida el Dec 18, 2020 a las 14:26 - por compilerhero
Votos positivos: 0 | Votos negativos: 0 -
Para lograr esto, primero necesitas convertir los datos JSON en un
JSONArray
. Luego, puedes iterar sobre elJSONArray
y comparar las fechas para obtener los datos correspondientes al intervalo de tiempo.Aquí te muestro un ejemplo de cómo puedes lograr esto:
java import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Main { public static void main(String[] args) throws JSONException, ParseException { String jsonData = "[{\"DT\":\"2020-12-18 09:20:00\", \"High\":1432.15, \"Open\":1425.8}, {\"DT\":\"2020-12-18 09:25:00\", \"High\":1425, \"Open\":1424}, {\"DT\":\"2020-12-18 09:30:00\", \"High\":1423.1, \"Open\":1423.1}, {\"DT\":\"2020-12-18 09:35:00\", \"High\":1421.1, \"Open\":1419.15}, {\"DT\":\"2020-12-18 09:40:00\", \"High\":1420.85, \"Open\":1418.7}, {\"DT\":\"2020-12-18 09:45:00\", \"High\":1418.9, \"Open\":1415.85}, {\"DT\":\"2020-12-18 09:50:00\", \"High\":1418.9, \"Open\":1418.5}]"; JSONArray jsonArray = new JSONArray(jsonData); int intervaloMinutos = 15; // Puedes cambiar el intervalo de minutos según tus necesidades DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date fechaAnterior = null; for (int i = 0; i < jsonArray.length(); i++) { JSONObject data = jsonArray.getJSONObject(i); Date fechaActual = dateFormat.parse(data.getString("DT")); if (fechaAnterior == null || (fechaActual.getTime() - fechaAnterior.getTime()) >= intervaloMinutos 60 1000) { System.out.println(data); fechaAnterior = fechaActual; } } } }
En este ejemplo, primero convertimos la cadena de datos JSON en un
JSONArray
. Luego, definimos el intervalo de tiempo en minutos y creamos un formato de fecha. Luego, iteraremos sobre elJSONArray
, parsearemos las fechas y compararemos si el tiempo transcurrido desde la fecha anterior es mayor o igual al intervalo especificado. Si es así, imprimiremos los datos correspondientes.Por favor, ajusta el código según tus necesidades específicas y asegúrate de manejar las excepciones adecuadamente.
Respondida el Dec 19, 2020 a las 14:21 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
java import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import org.json.JSONArray; import java.lang.reflect.Type; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.util.*; public class DataInterval { public static void main(String[] args) { // Datos de ejemplo String data = "[{\n" + " \"DT\": \"2020-12-18 09:20:00\",\n" + " \"High\": 1432.15,\n" + " \"Open\": 1425.8\n" + "}, {\n" + " \"DT\": \"2020-12-18 09:25:00\",\n" + " \"High\": 1425,\n" + " \"Open\": 1424\n" + "}, {\n" + " \"DT\": \"2020-12-18 09:30:00\",\n" + " \"High\": 1423.1,\n" + " \"Open\": 1423.1\n" + "}, {\n" + " \"DT\": \"2020-12-18 09:35:00\",\n" + " \"High\": 1421.1,\n" + " \"Open\": 1419.15\n" + "}, {\n" + " \"DT\": \"2020-12-18 09:40:00\",\n" + " \"High\": 1420.85,\n" + " \"Open\": 1418.7\n" + "}, {\n" + " \"DT\": \"2020-12-18 09:45:00\",\n" + " \"High\": 1418.9,\n" + " \"Open\": 1415.85\n" + "}, {\n" + " \"DT\": \"2020-12-18 09:50:00\",\n" + " \"High\": 1418.9,\n" + " \"Open\": 1418.5\n" + "}]"; // Convertir la cadena JSON a un objeto JSONArray JSONArray jsonArray = new JSONArray(data); // Crear un conversor Gson Gson gson = new Gson(); // Obtener el tipo de lista de objetos de datos de intervalo de tiempo Type type = new TypeToken
- >() {}.getType();
// Convertir el JSONArray a una lista de objetos de datos de intervalo de tiempo
List
intervalDataList = gson.fromJson(jsonArray.toString(), type); // Agrupar los datos por intervalo de 10 minutos Map > interval10Minutes = groupByInterval(intervalDataList, 10); // Imprimir los datos agrupados System.out.println("Datos agrupados por intervalo de 10 minutos:"); for (Map.Entry > entry : interval10Minutes.entrySet()) { System.out.println(entry.getKey()); for (TimeIntervalData intervalData : entry.getValue()) { System.out.println(intervalData); } } // Agrupar los datos por intervalo de 15 minutos Map > interval15Minutes = groupByInterval(intervalDataList, 15); // Imprimir los datos agrupados System.out.println("Datos agrupados por intervalo de 15 minutos:"); for (Map.Entry > entry : interval15Minutes.entrySet()) { System.out.println(entry.getKey()); for (TimeIntervalData intervalData : entry.getValue()) { System.out.println(intervalData); } } } // Método para agrupar los datos por intervalo de tiempo private static Map > groupByInterval(List intervalDataList, int interval) { // Ordenar los datos por fecha y hora intervalDataList.sort(Comparator.comparing(TimeIntervalData::getDateTime)); // Crear un mapa para almacenar los datos agrupados Map > intervalMap = new HashMap<>(); // Recorrer los datos y agruparlos por intervalo de tiempo LocalDateTime previousDateTime = null; List currentIntervalData = new ArrayList<>(); for (TimeIntervalData intervalData : intervalDataList) { // Obtener la fecha y hora actual LocalDateTime currentDateTime = intervalData.getDateTime(); // Comprobar si la fecha y hora actual está dentro del intervalo if (previousDateTime == null || currentDateTime.minusMinutes(interval).isAfter(previousDateTime)) { // Si es el primer intervalo o si la fecha y hora actual está fuera del intervalo anterior, // crear un nuevo intervalo y añadir los datos actuales String intervalKey = currentDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:00")); intervalMap.put(intervalKey, new ArrayList<>()); currentIntervalData = intervalMap.get(intervalKey); currentIntervalData.add(intervalData); } else { // Si la fecha y hora actual está dentro del intervalo, añadir los datos actuales al intervalo actual currentIntervalData.add(intervalData); } // Actualizar la fecha y hora anterior previousDateTime = currentDateTime; } // Devolver los datos agrupados return intervalMap; } // Clase para representar los datos del intervalo de tiempo static class TimeIntervalData { private LocalDateTime dateTime; private double high; private double open; public TimeIntervalData(String dateTime, double high, double open) { this.dateTime = LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); this.high = high; this.open = open; } public LocalDateTime getDateTime() { return dateTime; } public double getHigh() { return high; } public double getOpen() { return open; } @Override public String toString() { return String.format("{\"DT\": \"%s\", \"High\": %.2f, \"Open\": %.2f}", dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:00")), high, open); } } } Respondida el Dec 19, 2020 a las 14:32 - por Gemini
Votos positivos: 0 | Votos negativos: 0