[英]Grouping items by time-series bins in Python
我有看起來像的數據:
[[datetime1, label1],
[datetime2, label2],
[datetime3, label3]]
標簽是字符串。 我有一個裝箱參數(delta),它是datetime.timedelta。
我正在嘗試做的是:
所以我最終會得到類似:
[[datetimebin1, [label1, label2],
[datetimebin2, []],
[datetimebin3, []],
[datetimebin4, [label3]]
我一直指着熊貓,但沒有找到我想要的東西。 任何幫助深表感謝!
遵循這些原則應該可以:
# data: a lists of lists (length 2) of measurements
# res: resulting list of lists
# delta: time delta
# output list (will be a list of lists, as in the question
res = []
# end of first bin:
binstart = data[0][0]
res.append([binstart, []])
# iterate through the data item
for d in data:
# if the data item belongs to this bin, append it into the bin
if d[0] < binstart + delta:
res[-1][1].append(d[1])
continue
# otherwise, create new empty bins until this data fits into a bin
binstart += delta
while d[0] > binstart + delta:
res.append([binstart, [])
binstart += delta
# create a bin with the data
res.append([binstart, [d[1]]])
我認為@DrV是正確的答案,但是我准備了一個示例,試圖展示如何使用Pandas實現類似的功能:
import numpy
import pandas
import datetime
import time
# Binning delta
delta = datetime.timedelta(hours=1)
# Sample data
sample = [
['2014-08-09 16:30:00', 'label1'],
['2014-08-09 15:30:00', 'label2'],
['2014-08-09 14:30:00', 'label3'],
['2014-08-09 14:00:00', 'label4']
]
# Create dataframe and append UNIX timestamp column
df = pandas.DataFrame(sample)
df.columns = ['Datetime', 'Label']
df['Datetime'] = pandas.to_datetime(df['Datetime'])
df['UnixStamp'] = df['Datetime'].apply(lambda d: time.mktime(d.timetuple()))
df = df.set_index('Datetime')
# Calculate bins
bins = numpy.arange(min(df['UnixStamp']), max(df['UnixStamp']) + delta.seconds, delta.seconds)
# Group columns by datetime bin
def bin_from_tstamp(tstamp):
diffs = [abs(tstamp - bin) for bin in bins]
return bins[diffs.index(min(diffs))]
grouped = df.groupby(df['UnixStamp'].map(
lambda t: datetime.datetime.fromtimestamp(bin_from_tstamp(t))
))
此時, grouped
包含按日期時間箱grouped
的數據集。
以下是打印grouped.groups
的結果(其中鍵是日期時間倉,值是分組的日期時間):
{
numpy.datetime64('2014-08-09T18:00:00.000000000+0200'): [
Timestamp('2014-08-09 16:30:00')
],
numpy.datetime64('2014-08-09T17:00:00.000000000+0200'): [
Timestamp('2014-08-09 15:30:00')
],
numpy.datetime64('2014-08-09T16:00:00.000000000+0200'): [
Timestamp('2014-08-09 14:30:00'),
Timestamp('2014-08-09 14:00:00'
]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.