Zurück   Flashforum > Flash > ActionScript > ActionScript 2

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 06-07-2011, 14:18   #1 (permalink)
Linksaußen
 
Benutzerbild von Fralle
 
Registriert seit: Jun 2003
Ort: Essen
Beiträge: 552
Wertereihe mit Zeitstempeln in Raster teilen

Hallo,

ich habe eine Reihe von Werten (ca. 250) mit Zeitstempeln. Hier ein Beispielauszug:

06.07.2011 15:01:03.750 1.4327
06.07.2011 15:01:02.250 1.43265
06.07.2011 15:00:53.250 1.43275
06.07.2011 15:00:52.750 1.4327
06.07.2011 15:00:49.750 1.43265
06.07.2011 15:00:48.750 1.4326
06.07.2011 15:00:46.750 1.4327
06.07.2011 15:00:43.250 1.43265
06.07.2011 15:00:41.250 1.4326
06.07.2011 15:00:35.250 1.43255
06.07.2011 15:00:34.250 1.4325


Die Zeitstempel sind beliebig und haben unregelmäßige Abstände (einzige Einschränkung: sie sind immer auf Viertelsekunden gerundet).
Aus diesem Array möchte ich nun ein weiteres Objektarray generieren. Jedes Objekt dieses neuen Arrays soll immer einen bestimmten Zeitabschnitt (z.b. 10 Sekunden) abdecken und folgende vier Werte seines Zeitabschnitts speichern: erster, letzter, höchster, niedrigster.
Die 10-Sekunden-Abschnitte sollen immer geraden Werten entsprechen, also:

06.07.2011 15:00:00
06.07.2011 15:00:10
06.07.2011 15:00:20
06.07.2011 15:00:30
06.07.2011 15:00:40


Ist das verständlich erklärt?

Momentan habe ich noch keinen richtigen Ansatz, außer dass ich mit dem Date-Konstruktor und bspw. mit Number(date)%10000 leicht die Intervallgrenzen rausfiltern kann.

Könnt Ihr mir helfen eine Funktion zu entwickeln, die aus dem einfachen Array dieses Objektarray generieren kann?
__________________
Der Ball ist rund
Fralle ist offline   Mit Zitat antworten
Alt 06-07-2011, 22:23   #2 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.867
Zitat:
Könnt Ihr mir helfen eine Funktion zu entwickeln, die aus dem einfachen Array dieses Objektarray generieren kann?
wo genau liegt dein Problem?
beim parsen des Strings in ein Date-Objekt?
beim erstellen des Arrays?
beim Filtern eines Intervalls?
beim filtern der 4 Werte eines Intervalls?

wo kommen diese Zeilen her? aus PHP? XML?
wieso dieses Format? (ich persönlich war schon immer ein Freund von UNIX-Timestamps)
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist gerade online   Mit Zitat antworten
Alt 07-07-2011, 18:26   #3 (permalink)
Linksaußen
 
Benutzerbild von Fralle
 
Registriert seit: Jun 2003
Ort: Essen
Beiträge: 552
Zitat:
Zitat von thomas_E Beitrag anzeigen
wo genau liegt dein Problem?
Ich suche erstmal die grundsätzliche Herangehensweise, also die Struktur der Funktion und nicht die Syntax im Einzelnen.

Zitat:
Zitat von thomas_E Beitrag anzeigen
beim parsen des Strings in ein Date-Objekt?
Nein, kein Problem

Zitat:
Zitat von thomas_E Beitrag anzeigen
beim erstellen des Arrays?
var raster_array:Array = new Array();
raster_array[i] = new Object();
raster_array[i].letzter = xy;
raster_array[i].erster = xy;
raster_array[i].hoch = xy;
raster_array[i].tief = xy;
??
Sollte auch kein Problem sein...

Zitat:
Zitat von thomas_E Beitrag anzeigen
beim Filtern eines Intervalls?
Ich habe eine Funktion, die den Zeitstempel in ein Date-Objekt umwandeln kann und dieses als Number zurück gibt. Mit dieser Zahl und dieser einfachen Formel: new Date(zeit - zeit % intervms) (wobei die Var 'intervms' die Intervall-Größe in Millisekunden darstellt) oder ähnlich sollte ich das Intervall bestimmen können. Wie dieses Konstrukt in der Funktion untergebracht werden muss, weiss ich noch nicht.


Zitat:
Zitat von thomas_E Beitrag anzeigen
beim filtern der 4 Werte eines Intervalls?
Sollte auch nicht zu schwierig sein, ergibt sich teilweise auch weil bspw. gilt: der erste des neuen Intervalls ist immer der letzte des vorausgegangenen.

Zitat:
Zitat von thomas_E Beitrag anzeigen
wo kommen diese Zeilen her? aus PHP? XML?
wieso dieses Format? (ich persönlich war schon immer ein Freund von UNIX-Timestamps)
Ursprünglich ist es ein XML-File eines Webservice, das wird aber schon verarbeitet und in ein Array gebracht, welches ich als Grundlage für dieses weitere Array nehmen wollte...
Wie genau sehen die UNIX-Timestamps aus?
__________________
Der Ball ist rund
Fralle ist offline   Mit Zitat antworten
Alt 08-07-2011, 02:20   #4 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.867
Zitat:
Ich suche erstmal die grundsätzliche Herangehensweise, also die Struktur der Funktion und nicht die Syntax im Einzelnen.
*g schau dir nochmal meine Fragen an, damit hast du doch schon eine Struktur, um das ganze abzuarbeiten.

Zitat:
Wie genau sehen die UNIX-Timestamps aus?
int-Werte, die Sekunden/Milisekunden seit dem 01.01.1970 00:00:00 GMT
PHP gibt einen Wert in Sekunden wieder, optional mit milisekunden-Angabe
über Date.getTime() erhälst du eine ganzzahl, die die Anzahl der Milisekunden seit o.g. Zeitpunkt wiedergibt.
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist gerade online   Mit Zitat antworten
Alt 08-07-2011, 04:36   #5 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.867
PHP-Code:
var s:String "06.07.2011 15:01:03.750 1.4327\n"
    
"06.07.2011 15:01:02.250 1.43265\n"
    
"06.07.2011 15:00:53.250 1.43275\n"
    
"06.07.2011 15:00:52.750 1.4327\n"
    
"06.07.2011 15:00:49.750 1.43265\n"
    
"06.07.2011 15:00:48.750 1.4326\n"
    
"06.07.2011 15:00:46.750 1.4327\n"
    
"06.07.2011 15:00:43.250 1.43265\n"
    
"06.07.2011 15:00:41.250 1.4326\n"
    
"06.07.2011 15:00:35.250 1.43255\n"
    
"06.07.2011 15:00:34.250 1.4325";

//enthält DatenObjekte mit value, date und ts
var arr:Array = parseArray(s.split("\n"));
//Demo:
var map10:Object mapData(arr10arr[0].ts/1000);
traceMap(map10);

var 
map60:Object mapData(arr60);
traceMapmap60 );

var 
mapCrazy:Object mapData(arr42.792);  //ein Interval von 42.792 Sekunden ist doch irre :D
traceMapmapCrazy );


//FUNKTIONEN

//erzeugt aus dem Array eine "Karte" mit all den daten, die du benötigst
//interval und offset werden in Sekunden angegeben
function mapData(arr:Array, interval:Numberoffset:Number):Object
{
    if(
isNaN(offset)) offset 0;
    
    var 
map:Object = {
        
offsetoffset,
        
intervalinterval,
        
indices: []
    };
    
    for(var 
i:Number arr.lengthi--; ){
        var 
d:Object arr[i];
        var 
n:Number Math.floor((d.ts/1000 offset) / interval);        //das n-te Zeitinterval seint 1.1.1970
        
        
var segment:Object map[n]
        if(!
segment){
            
map.indices.push(n);
            
map[n] = {
                
mapmap,
                
beginsAt: new Dateinterval ),
                
endsAt: new Date( (n+1) * interval-),
                
                
values: [d],
                
//was ist dir hier lieber? Referenzen auf das Objekt, das den Wert enthält,
                //oder der jeweilige Wert selber?
                
firstd,
                
lastd,
                
mind,
                
maxd
            
};
        }else{
            
segment.values.push(d);
            if(
d.ts segment.first.tssegment.first d;
            else if(
d.ts segment.last.tssegment.last d;
            
            if(
d.value segment.min.valuesegment.min d;
            else if(
d.value segment.max.valuesegment.max d;
        }
    }
    
    
//cleanup
    
map.indices.sort(Array.NUMERIC);
    for(
i=map.indices.lengthi--; ){
        
mapmap.indices[i] ].values.sortOn('ts', Array.NUMERIC);
    }
    
    
map.first mapmap.indices[0] ];
    
map.last mapmap.indicesmap.indices.length-] ];
    
    return 
map;
}


//parst das String-Array in ein Objekt-Array, und sortiert das einmal nach Zeitpunkt
function parseArray(arr:Array):Array
{
    
arr arr.slice();    //kopie erstellen
    
for(var i:Number arr.lengthi--; ) arr[i] = parseLine(arr[i]);
    
arr.sortOn("ts", Array.NUMERIC);
    return 
arr;
}

//parst eine einzelne Zeile, in ein Datums-Objekt, einen Timecode und den Wert
function parseLine(l:String):Object
{
    
//Datum-und Uhrzeit 
    
var s:String ""t:Array = [];
    for(
i=0t.length 7; ++i){
        var 
c:String l.charAt(i);
        if(
" :.".indexOf(c) > -1){
            
t.push(parseInt(s10));
            
"";
        }else{
            
+= c;
        }
    }
    var 
d:Date = new Date(t[2], t[1], t[0], t[3], t[4], t[5], t[6]);
    
    
//Wert
    
var v:Number parseFloat(l.substring(il.length));
    
    return {
        
tsNumber(d),
        
dated,
        
valuev
    
};
}

//erzeugt einen umfangreichen Trace der Map
function traceMap(map:Object){
    var 
numIndices:Number map.indices.length
    trace
('');
    
trace('Interval ' map.interval ' Seconds');
    
trace("Number of Intervals: " numIndices);
    
trace('//////////');
    
//eine Möglichkeit
//    for(var s:String in map){
//        if(isNaN(s)) continue;

//ich persönlich würde hier jedoch diese bevorzugen
    
for(var i:Number 0i<numIndices; ++i){
        var 
interval:Object mapmap.indices[i] ];
        
        
trace(map.indices[i] + '      from: ' interval.beginsAt.toString() + 
            
'   to: ' interval.endsAt.toString());
        
trace('  number of Values: ' interval.values.length);
//        trace('  first @           ' +  interval.first.ts);
        
trace('  first @           ' +  interval.first.date.toString());
//        trace('  last @            ' +  interval.last.ts);
        
trace('  last @            ' +  interval.last.date.toString());
        
trace('  min Value:        ' +  interval.min.value);
        
trace('  max Value:        ' +  interval.max.value);
        
trace('//////////');
    }
    
trace('');
    

Code:
Map:	enthält Segment-Objekte abhängig von Interval und offset, der verwendet wurde, um diese "Karte" zu erzeugen
	indices:	Array mit den belegten Indices
	interval:	Der Interval, der verwendet wurde, um diese Map anzulegen
	offset:		offset gibt einen Zeitversatz, quasi den Beginn der Rechnug der Zeitabschnitte an
	first:		das früheste Segment-Objekt (Zeitabschnitt)
	last:		das späteste Segment-Objekt (Zeitabschnitt)
	...			für jeden Eintrag in indices ist ein Segment in map vorhanden
				Beispiel: 
					wenn map.indices[0] == 12345 ist, 
					dann gibbet unter map[12345] ein Segment-Objekt dazu

Segment-Objekt:		Beschreibt einen Zeitabschnitt, bei einem bestimmten Interval, und die darin vorkommenden Datenobjekte
	values:		Array mit den DatenObjekten in diesem Zeitabschnitt
	beginsAt:	ein Date-Objekt, dass den Beginn des Zeitabschnittes angibt, den dieses Segment überdeckt
	endsAt:		ein Date-Objekt, dass das Ende des Zeitabschnittes angibt...
	first:		das früheste DatenObjekten
	last:		das späteste DatenObjekten
	min:		das Datenobjekt, mit dem niedrigsten value
	max:		das Datenobjekt mit dem höchsten value
	

DatenObjekt:	//Kleinste "Einheit" in diesem Baum, hält einfach nur Wert und Zeitpunkt zusammen
	date:		ein Date-Objekt, dass den Zeitpunkt dieses Eintrags definiert
	value:		der Wert dieses Eintrags,
	ts:			ein timestamp (in ms)
__________________
greetz Thomas

plz RTFM & Coding Conventions

Geändert von thomas_E (08-07-2011 um 04:40 Uhr)
thomas_E ist gerade online   Mit Zitat antworten
Alt 09-07-2011, 17:52   #6 (permalink)
Linksaußen
 
Benutzerbild von Fralle
 
Registriert seit: Jun 2003
Ort: Essen
Beiträge: 552
Hallo Thomas,


vielen Dank für die ausführliche Antwort!
Ich werde mir das Script in allen Einzelheiten ansehen und das Rückmeldung geben.


Gruß,
Fralle
__________________
Der Ball ist rund
Fralle ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Array mit Zeitstempeln zum richtigen Zeitpunkt wiedergeben Fralle ActionScript 2 1 03-09-2010 23:58
MC teilen Timyy ActionScript 3 3 09-02-2010 09:43
PNG raster harego Flash MX 2004 4 16-03-2005 15:54
Raster MellonCollie Flash MX 3 26-02-2004 16:10
raster jig ActionScript 1 7 11-11-2002 13:10


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele