我有一些按日期组织的数据,为datetime index。然后我将其子集化,这样实际上是不规则的:
date_rng = pd.date_range(start='1/1/2018', end='1/8/2018', freq='H')
df = pd.DataFrame(date_rng, columns=['date'])
df['data'] = np.random.randint(0,100,size=(len(date_rng)))
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date', drop=True)
df = df[df['data'] > 75]
在我的服务中(这不是用于交互式使用),我得到一个字符串,该字符串传递给pandas.resample
,以将我的时间数据聚合到任何级别。该字符串直接提供给rule
参数,并且可以是'H'
,'3T'
,'Q'
,'M'
我想使用相同的字符串来创建一个类似于以下结构的json:
{'my_aggregate_level_1': {'2018-01-01 03:00:00', '2018-01-01 07:00:00'},
'my_aggregate_level_2':{'2018-01-08 03:00:00'}}
该数组将变得“参差不齐”,即并非所有记录都将存在,并且json中的所有键都不具有相同的数组长度。
一个好的解决方案的目标是:
my_aggregate_level
是由与resample
中相同的字符串参数设置的级别'D'
然后使用.strftime
这样的“翻译规则”相关联,但是如果{{1} },如果'H'
使用,则使用此'M'
仅返回原始值的单个数组因此,实际上,如果提供了'H'
:
'D'
请注意,每天有两个键,数组中的值会拆分为正确的日期。
如果提供了{'2018-01-01': {'2018-01-01 03:00:00', '2018-01-01 07:00:00'},
'2018-01-08':{'2018-01-08 03:00:00'}}
:
'M'
请注意,这意味着在此示例中,值数组的内容将为3,因为3个日期时间都在同一月份
{'2018-01': {'2018-01-01 03:00:00', '2018-01-01 07:00:00', '2018-01-08 03:00:00'}}
,根据某些规则,它们看起来像仅在聚合。我特别需要返回实际记录Groupers
参数解析一个新列在技术上是可行的,但是这似乎是错误的,因为我必须开始将每个rule
转换为rule
或类似名称。我尚未找到接受相同字符串并且也不执行聚合的函数strftime
,'D'
等来填充它。'M'
哪个不起作用。
我了解,这可能无法通过上述规则解决,但我可能还不擅长def custom_resampler(array_like):
return array_like
df.resample('W').apply(custom_resampler)
才能实现。
答案 0 :(得分:0)
返回结构实际上是一系列的,因此可以使用此方法过滤空列表索引点:
df.resample('D').apply(custom_resampler).apply(len) > 0
我相信我已经找到了解决方案。
具体地说,我使用自定义重采样器是错误的,实际上,它们可以自己进行json转换。我需要进行一些处理才能获得所需的结果,但是现在这是答案:
def custom_resampler(array_like):
return array_like.to_json()
df.resample('D').apply(custom_resampler)
很乐意对此进行纠正/完善/改进。