python - Pandas DataFrame 包含 JSON 格式的日期和时间

标签 python json pandas dictionary dataframe

我使用 pandas DataFrame.json 文件导入数据,结果有点损坏:

              >> print df
              summary                                response_date
                  8.0  {u'$date': u'2009-02-19T10:54:00.000+0000'}
                 11.0  {u'$date': u'2009-02-24T11:23:45.000+0000'}
                 14.0  {u'$date': u'2009-03-03T17:55:07.000+0000'}
                 16.0  {u'$date': u'2009-03-10T12:23:04.000+0000'}
                 19.0  {u'$date': u'2009-03-17T17:19:55.000+0000'}
                 13.0  {u'$date': u'2009-03-25T15:10:52.000+0000'}
                 22.0  {u'$date': u'2009-04-02T16:57:31.000+0100'}
                 15.0  {u'$date': u'2009-04-08T22:29:09.000+0100'}
                 20.0  {u'$date': u'2009-04-16T18:14:20.000+0100'}
                 13.0  {u'$date': u'2009-04-29T10:47:06.000+0100'}
                 15.0  {u'$date': u'2009-05-06T13:45:45.000+0100'}
                 20.0  {u'$date': u'2009-05-26T10:41:52.000+0100'}

如何摆脱“日期”和其他困惑,以创建包含日期和时间的普通列。要从 ISO8601 格式转换,我通常使用:

df.response_date = pd.to_datetime(df.response_date)

更新1

       summary                 response_date                                  closed_date                                    open_date
          24.0  2011-10-15T00:00:00.000+0100                                          NaN                                          NaN
          24.0  2011-11-24T09:00:00.000+0000                                          NaN                                          NaN
          19.0  2011-10-01T09:00:00.000+0100                                          NaN                                          NaN
          25.0  2011-10-29T09:00:00.000+0100                                          NaN                                          NaN
          19.0  2011-10-08T09:00:00.000+0100                                          NaN                                          NaN
          -1.0  2011-11-09T17:20:00.000+0000  {u'$date': u'2011-11-16T15:20:00.000+0000'}  {u'$date': u'2011-11-09T15:20:00.000+0000'}
          -1.0  2011-11-16T17:20:00.000+0000  {u'$date': u'2011-11-23T15:20:00.000+0000'}  {u'$date': u'2011-11-16T15:20:00.000+0000'}
          -1.0  2011-11-23T17:20:00.000+0000  {u'$date': u'2011-11-30T15:20:00.000+0000'}  {u'$date': u'2011-11-23T15:20:00.000+0000'}
          -1.0  2011-11-30T17:20:00.000+0000  {u'$date': u'2011-12-07T15:20:00.000+0000'}  {u'$date': u'2011-11-30T15:20:00.000+0000'}

所以,

>> df.response_date = pd.DataFrame(df.response_date.values.tolist())

工作完美,但其他列包含 NaN 值,并且用“-1”进行插补没有帮助。

>> print type(df.ix[0,'scheduleClosedAt'])
<type 'int'>

更新2

为什么这个(屏蔽)方法不起作用?

>> df.reset_index(inplace=True)
>> indx_nan_closed = df.closed_date.isnull()
>> df[~indx_nan_closed].closed_date = pd.DataFrame(df[~indx_nan_closed].closed_date.values.tolist())

这一行与上面的一行等效,但带有掩码数组,因此我只想将此方法应用于非 NaN 值,但结果是我的数据框“df”保持不变。这很奇怪。

有什么想法吗?

最佳答案

您可以使用 DataFrame 构造函数将列 response_date 转换为 list values如果 typedict:

print (type(df.ix[0,'response_date']))
<class 'dict'>

df.response_date = pd.DataFrame(df.response_date.values.tolist())
df.response_date = pd.to_datetime(df.response_date)
print (df)
   summary       response_date
0      8.0 2009-02-19 10:54:00
1     11.0 2009-02-24 11:23:45
2     14.0 2009-03-03 17:55:07

如果typestring,则使用splitstrip :

print (type(df.ix[0,'response_date']))
<class 'str'>

df.response_date = df.response_date.str.split().str[1].str.strip("'u}")
df.response_date = pd.to_datetime(df.response_date)

print (df)
   summary       response_date
0      8.0 2009-02-19 10:54:00
1     11.0 2009-02-24 11:23:45
2     14.0 2009-03-03 17:55:07

按评论编辑:

2种可能的解决方案:

第一个是fillna通过空 dict:

df.closed_date = df.closed_date.fillna(pd.Series([{}]))

另一个是boolean indexing :

import numpy as np
import pandas as pd

df = pd.DataFrame({'summary':[19.0, -1.0,-1.0],
                   'response_date':['2011-10-08T09:00:00.000+0100','2011-11-09T17:20:00.000+0000','2011-11-16T17:20:00.000+0000'],
              'closed_date':[np.nan, {u'$date': u'2011-11-16T15:20:00.000+0000'}, {u'$date': u'2011-11-23T15:20:00.000+0000'}]},
                   columns=['summary','response_date','closed_date'])

print (df)
   summary                 response_date  \
0     19.0  2011-10-08T09:00:00.000+0100   
1     -1.0  2011-11-09T17:20:00.000+0000   
2     -1.0  2011-11-16T17:20:00.000+0000   

                                 closed_date  
0                                        NaN  
1  {'$date': '2011-11-16T15:20:00.000+0000'}  
2  {'$date': '2011-11-23T15:20:00.000+0000'} 
a = df.ix[df.closed_date.notnull(), 'closed_date'] 
print (a)
1    {'$date': '2011-11-16T15:20:00.000+0000'}
2    {'$date': '2011-11-23T15:20:00.000+0000'}
Name: closed_date, dtype: object

df['closed_date'] = pd.DataFrame(a.values.tolist(), index=a.index)
df.closed_date = pd.to_datetime(df.closed_date)
print (df)

   summary                 response_date         closed_date
0     19.0  2011-10-08T09:00:00.000+0100                 NaT
1     -1.0  2011-11-09T17:20:00.000+0000 2011-11-16 15:20:00
2     -1.0  2011-11-16T17:20:00.000+0000 2011-11-23 15:20:00

关于python - Pandas DataFrame 包含 JSON 格式的日期和时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39659146/

相关文章:

python - 使用 yield 为函数编写单元测试

javascript - 使用 jQuery 从 Json 输出 HTML 字符串

python - 无法找到模块 qiskit_aqua.algorithms

javascript - 如何从 json 输出中检索值?

javascript - 如何加载 CSV 和 JSON 文件并使用 d3.json、d3.csv 和 d3.zip 将两个数据集合并为一个数据集

python - 将 Pandas 数据框导出到 Excel 多表文件的正确方法是什么?

python - Pandas:选择两个日期之间的 DataFrame 行(日期时间索引)

python - 对空值执行算术运算

python - 在python中制作递归函数

python - 如何从嵌套 json 中提取字段并保存在数据结构中