我的数据如下所示:
[[datetime1, label1],
[datetime2, label2],
[datetime3, label3]]
标签是字符串。我有一个分箱参数 (delta),它是一个 datetime.timedelta。
我正在尝试做的事情:
- 提出一组日期时间 bin,按 delta 等间隔。换句话说,在下面,datetimebin2 - datetimebin1 = datetimebin3 - datetimebin2 = delta。
- 将标签放入这些容器中。
所以我最终会得到这样的东西:
[[datetimebin1, [label1, label2],
[datetimebin2, []],
[datetimebin3, []],
[datetimebin4, [label3]]
有人向我指出 pandas,但没有找到我要找的东西。非常感谢任何帮助!
最佳答案
我认为@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
包含按日期时间 bin 分组的数据集。
以下是打印 grouped.groups
的结果(其中键是日期时间 bin,值是分组的日期时间):
{
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'
]
}
关于python - 在 Python 中按时间序列箱对项目进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25219015/