首页 > 解决方案 > 我应该如何从熊猫数据框中构造这个 json 返回

问题描述

我有一些按日期组织的数据,作为日期时间索引。然后我将其子集化,因此它实际上是不规则的:

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 中的所有键都具有相同的数组长度。

一个好的解决方案的目标是:

  1. my_aggregate_level是由与给定相同的字符串参数设置的级别resample
  2. 聚合级别中的数组将始终是原始的日期时间每小时值
  3. 理想情况下,字符串参数不与一堆“翻译规则”相关联,例如“If 'D'then use .strftimelike this, but if 'H'use this and if 'M'use this
  4. 'H'只会返回一个原始值的数组

所以在实践中,如果'D'提供 a :

{'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'提供:

{'2018-01': {'2018-01-01 03:00:00', '2018-01-01 07:00:00', '2018-01-08 03:00:00'}}

请注意,这意味着在此示例中 value 数组的内容将为 3,因为 3 个日期时间都在同一个月

我尝试过/看过但效果不佳的事情:

def custom_resampler(array_like):
    return array_like

df.resample('W').apply(custom_resampler)

这是行不通的。

我理解,这可能是上述规则无法解决的问题,但我可能还不够擅长pandas实现它。

标签: pythonjsonpandasdataframedatetime

解决方案


更新:

返回结构实际上是一个系列,因此可以使用此方法过滤空列表索引点:

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)

很高兴对此进行纠正/改进/改进。


推荐阅读