2016-04-06 9 views
-1

Ich versuche, einige Daten zu teilen, die Daten in dieser Form ...Splitting Daten - spezifischer Fall

['20150406,34.4800,34.8100,34.2300,34.4200,21480500', '20150407,34.5400,34.8900,34.5100,34.6300,14331200'] 

Das erste Element in jedem String in der Liste ist ein Datum, ich versuche, Split die Daten zu einem ausgewählten Zeitpunkt. Aber haben die ganze Reihe ... Zum Beispiel, wenn mein gewähltes Datum ist 2015.04.07 die obigen Daten wie folgt aufgeteilt würden ...

['20150406,34.4800,34.8100,34.2300,34.4200,21480500'] 

['20150407,34.5400,34.8900,34.5100,34.6300,14331200'] 

Dies gilt auch für Listen mit vielen Saiten in der Arbeit hat gleiche Form wie diese ...

+0

Kann es viele gleiche Daten geben? Können Sie ein Beispiel für mehrere Elemente hinzufügen? –

Antwort

3

Verwenden next() und enumerate() die Position der Zeichenfolge mit dem gewünschten Datum zu finden, dann Scheibe:

>>> d = '20150407' 
>>> l = [ 
...  '20150406,34.4800,34.8100,34.2300,34.4200,21480500', 
...  '20160402,34.1,32.8100,33.2300,31.01,22282510', 
...  '20150407,34.5400,34.8900,34.5100,34.6300,14331200', 
...  '20120101,2.540,14.8201,32.00,30.1311,12331230' 
... ] 
>>> index = next(i for i, item in enumerate(l) if item.startswith(d)) 
>>> l[:index] 
['20150406,34.4800,34.8100,34.2300,34.4200,21480500', '20160402,34.1,32.8100,33.2300,31.01,22282510'] 
>>> l[index:] 
['20150407,34.5400,34.8900,34.5100,34.6300,14331200', '20120101,2.540,14.8201,32.00,30.1311,12331230'] 

Paar Hinweise:

  • next() würde eine StopIteration Ausnahme durch, wenn es keine Übereinstimmung sein - entweder man es mit try/except oder bieten einen Standardwert, -1 zum Beispiel handhaben sollte:

    next((i for i, item in enumerate(l) if item.startswith(d)), -1) 
    
  • zu überprüfen, ob das Datum Streichhölzer eine gewünschte, überprüfen wir einfach, ob ein Element mit einer bestimmten Datumszeichenkette beginnt. Wenn das gewünschte Datum als date oder datetime kommt, müssen Sie es zu formatieren vorher strftime() mit:

    >>> from datetime import datetime 
    >>> d = datetime(2015, 4, 7) 
    >>> d = d.strftime("%Y%m%d") 
    >>> d 
    '20150407' 
    
+0

Sie können der Zeichenkette ein "", "' hinzufügen, das der genauen Teilzeichenfolge entspricht –

2

Ich denke, Sie groupby wollen, Streicher Gruppierung, die mit dem Datum und Einsen nicht anfangen dass sie so begrenzt das Datum der Gruppen:

l = ['20150406,34.4800,34.8100,34.2300,34.4200,21480500', '2015010,34.5400,34.8900,34.5100,34.6300,14331200' 
    , '20150407,34.5400,34.8900,34.5100,34.6300,14331200'] 
dte = "2015-04-07" 

delim = dte.replace("-","") + "," 
from itertools import groupby 

print([list(v) for k,v in groupby(l,key=lambda x: not x.startswith(delim))]) 

[['20150406,34.4800,34.8100,34.2300,34.4200,21480500', '2015010,34.5400,34.8900,34.5100,34.6300,14331200'], ['20150407,34.5400,34.8900,34.5100,34.6300,14331200']] 

die groupby halten werden die Daten so oft aufteilen, da Strings der Start mit dem aktuellen Stand sind.

1

Durch Erweitern von Alecxe Antwort: Der Code kann die ursprüngliche Liste teilen, um die Teilliste nach Eingabedatum zu koppeln.

l = [ 
...  '20150406,34.4800,34.8100,34.2300,34.4200,21480500', 
...  '20160402,34.1,32.8100,33.2300,31.01,22282510', 
...  '20150407,34.5400,34.8900,34.5100,34.6300,14331200', 
...  '20120101,2.540,14.8201,32.00,30.1311,12331230', 
... '20150407,34.5400,34.8900,34.5100,34.6300,14331200',] 

index = [i for i, item in enumerate(l) if item.startswith(d)] 
[l[i:j] for i, j in zip([0]+index, index+[None])] 

output: 
[['20150406,34.4800,34.8100,34.2300,34.4200,21480500', '20160402,34.1,32.8100,33.2300,31.01,22282510'], ['20150407,34.5400,34.8900,34.5100,34.6300,14331200', '20120101,2.540,14.8201,32.00,30.1311,12331230'], ['20150407,34.5400,34.8900,34.5100,34.6300,14331200']]