我应该如何从熊猫数据帧构造此json返回

时间:2019-06-20 08:10:22

标签: python json pandas dataframe datetime

我有一些按日期组织的数据,为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中的所有键都不具有相同的数组长度。

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

  1. my_aggregate_level是由与resample中相同的字符串参数设置的级别
  2. 聚合级别中的数组将始终是原始的日期时间每小时值
  3. 理想情况下字符串参数未与诸如“如果'D'然后使用.strftime这样的“翻译规则”相关联,但是如果{{1} },如果'H'使用,则使用此
  4. '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) 才能实现。

1 个答案:

答案 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)

很乐意对此进行纠正/完善/改进。