Python 如何在dataframe中解包日期时间值?

Python 如何在dataframe中解包日期时间值?,python,pandas,dataframe,Python,Pandas,Dataframe,我查询MongoDB数据库并返回一个带有值字段的dataframe,其中10分钟的时间戳是值的关键: date values 2017-04-30 {u'00:00:00': u'13.12', u'00:10:00': .....u'23:50:00': u'12.34'} 2017-05-01 {u'00:00:00': u'15.56', u'00:10:00': .....u'23:50:00': u'15.78'} 2017-05-02 {u'00:00:00':

我查询MongoDB数据库并返回一个带有值字段的dataframe,其中10分钟的时间戳是值的关键:

date        values
2017-04-30  {u'00:00:00': u'13.12', u'00:10:00': .....u'23:50:00': u'12.34'}
2017-05-01  {u'00:00:00': u'15.56', u'00:10:00': .....u'23:50:00': u'15.78'}
2017-05-02  {u'00:00:00': u'11.34', u'00:10:00': .....u'23:50:00': u'13.21'}
2017-05-03  {u'00:00:00': u'17.07', u'00:10:00': .....u'23:50:00': u'14.22'}
2017-05-04  {u'00:00:00': u'18.03', u'00:10:00': .....u'23:50:00': u'18.09'}
我想将其转换为更易于绘制的序列或元组对象:

[(2017-04-30 00:00:00, 13.12)....... (2017-05-04 23:50:00, 18.09)]

我现在的方法涉及到一些复杂的函数和大量的数据争论,也许有一种更简单的方法

假设
df
是您的数据帧

df = pd.DataFrame({'date':['2017-04-30', '2017-05-01', '2017-05-02', '2017-05-03', '2017-05-04']})
df['values']=None
df.set_value(0, 'values', {u'00:00:00': u'13.12', u'23:50:00': u'12.34'})
df.set_value(1, 'values', {u'00:00:00': u'13.12', u'23:50:00': u'12.34'})
df.set_value(2, 'values', {u'00:00:00': u'13.12', u'23:50:00': u'12.34'})
df.set_value(3, 'values', {u'00:00:00': u'13.12', u'23:50:00': u'12.34'})
df.set_value(4, 'values', {u'00:00:00': u'13.12', u'23:50:00': u'12.34'})
然后输出

[({date}{time}'。格式(date=date,time=time),p)
对于日期,zip中的v(df['date'],df['values'])
对于时间,p在v.items()中
]

结果

[('2017-04-30 00:00:00', '13.12'),
 ('2017-04-30 23:50:00', '12.34'),
 ('2017-05-01 00:00:00', '13.12'),
 ('2017-05-01 23:50:00', '12.34'),
 ('2017-05-02 00:00:00', '13.12'),
 ('2017-05-02 23:50:00', '12.34'),
 ('2017-05-03 00:00:00', '13.12'),
 ('2017-05-03 23:50:00', '12.34'),
 ('2017-05-04 00:00:00', '13.12'),
 ('2017-05-04 23:50:00', '12.34')]
选项1
相当紧凑的理解

选项2
一个更像熊猫的解决方案

设置

tidx = pd.date_range('1970-01-01', periods=6 * 24, freq='10T')
dates = pd.date_range('2017-04-30', periods=5)
df = pd.DataFrame(dict(
        date=dates,
        values=[
            {d.strftime('%H:%M:%S'): str((np.random.rand(1) * 20).round(2)[0]) for d in tidx}
            for _ in range(5)
        ]
    ))

你能在JSONC中发布完整的数据结构吗?你能澄清一下tidx对象在设置中是什么吗?看起来好像没定下来。对不起,我漏掉了一行。我已经更新了我的答案。这是一个非常有用和聪明的解决方案-谢谢。
from pandas import to_datetime as todt
from pandas import to_timedelta as totd

d1 = df.set_index('date')['values'] \
       .apply(pd.Series).rename_axis('time', 1) \
       .stack().reset_index(name='val')

d1.assign(
    datetime=d1.date + totd(d1.time)
).groupby('date').apply(
    lambda x: list(zip(x.datetime, x.val))
)


date
2017-04-30    [(2017-04-30 00:00:00, 12.84), (2017-04-30 00:...
2017-05-01    [(2017-05-01 00:00:00, 14.32), (2017-05-01 00:...
2017-05-02    [(2017-05-02 00:00:00, 16.86), (2017-05-02 00:...
2017-05-03    [(2017-05-03 00:00:00, 10.82), (2017-05-03 00:...
2017-05-04    [(2017-05-04 00:00:00, 9.93), (2017-05-04 00:1...
dtype: object
tidx = pd.date_range('1970-01-01', periods=6 * 24, freq='10T')
dates = pd.date_range('2017-04-30', periods=5)
df = pd.DataFrame(dict(
        date=dates,
        values=[
            {d.strftime('%H:%M:%S'): str((np.random.rand(1) * 20).round(2)[0]) for d in tidx}
            for _ in range(5)
        ]
    ))