2016-07-06 5 views
2

I folgende Datetimes zu gruppieren möchte zusammen in C# Linq wie folgt:C# linq Gruppe durch eine Datumzeit auf die nächste Sekunde

Gruppe 1:

2015-03-03 15:18:42.880 
2015-03-03 15:18:42.897 

Gruppe 2:

2015-03-19 16:29:59.977 
2015-03-19 16:29:59.983 
2015-03-19 16:29:59.983 

Gruppe 3:

2015-03-26 11:27:29.813 
2015-03-26 11:27:30.030 
2015-03-26 11:27:30.030 

Gruppe 4:

2015-03-27 15:13:58.483 
2015-03-27 15:13:58.483 
2015-03-27 15:13:58.500 

Ich bin mit einigen dieser Gruppierungen ein Problem haben. Momentan gruppiere ich nur die Daten und ignoriere den Millisekunden-Anteil. Was ich möchte, gruppieren Sie Daten, die innerhalb von 1 Sekunde ohne die Millisekunden liegen. Das ist meine Abfrage so weit:

var query = 
from trans in TransactionTable.AsEnumerable()               
let dateWithoutMilliseconds = trans.Field<DateTime>("TranactionDate").AddMilliseconds(-trans.Field<DateTime>("TranactionDate").Millisecond) 
group trans by dateWithoutMilliseconds into g 
select new 
{         
TransDate = g.Key,                 
}; 
+3

Es ist nicht klar, was Sie mit Meinst du Gruppe auf die nächste ganze Sekunde? Weil das immer noch Daten gruppiert, die innerhalb einer Sekunde voneinander in verschiedenen Gruppen sind, z. 2015-03-26 11: 27: 29.513 und 2015-03-26 11: 27: 29.413 - sie sind nur 100ms voneinander entfernt, aber der erste würde bis zum 2015-03-26 11:27:30 runden und der zweite würde abzurunden bis 2015-03-26 11:27:29. –

+0

Also wenn Sie 2015-03-03 15: 18: 42.880, 2015-03-03 15: 18: 43.000 bis 2015-03-03 20: 00: 00.000 kontinuierliche Daten alle mit nur 1 Sek. Differenz haben, werden Sie dies gruppieren in 1? –

+0

Das gewünschte Ergebnis ist nicht klar; vielleicht möchten Sie die Gruppenbasis nach einem Kriterium erstellen, das von den Daten selbst abhängt, das [Clustering] genannt wird (https://en.wikipedia.org/wiki/Cluster_analysis). – Codor

Antwort

1

Sie können Ticks (100 Nanosekunden) umwandeln, runden und dann auf DateTime zurück. Im Fall, dass Sie nur GroupBy nur Tick s aufrunden: „Was ich möchte, es tun Gruppe Daten, die ohne die Millisekunden innerhalb 1 Sekunde voneinander sind“

DateTime source = ... 
... 
// Up to nearest second 
const int shift = 10000000; 

DateTime result = new DateTime(
    (source.Ticks/shift + (source.Ticks % shift >= (shift/2) ? 1 : 0)) * shift); 

// If you want just a key to group by 
long key = (source.Ticks/shift + (source.Ticks % shift >= (shift/2) ? 1 : 0)) * shift;