【问题标题】:Pandas saving and reading DataFrame to jsonPandas 将 DataFrame 保存和读取到 json
【发布时间】:2014-11-10 12:56:56
【问题描述】:

我正在尝试将带有一些日期的 pandas DataFrame 保存到 json 中,然后将其读回。虽然当我从 json 读回时,我得到的日期格式不同(大部分时间需要再次解析日期)。

import pandas as pd
df = pd.Series(range(7),pd.date_range('2014-10-01','2014-10-07')).reset_index()
df.columns = ['LoadDate','number']
print df

    LoadDate  number
0 2014-10-01       0
1 2014-10-02       1
2 2014-10-03       2
3 2014-10-04       3
4 2014-10-05       4
5 2014-10-06       5
6 2014-10-07       6

现在,如果我要导出到并读取回来,我会得到以下结果(不需要)

print pd.read_json(df.to_json())

        LoadDate  number
0  1412121600000       0
1  1412208000000       1
2  1412294400000       2
3  1412380800000       3
4  1412467200000       4
5  1412553600000       5
6  1412640000000       6

我希望能够以原始格式读回日期。我怎样才能以干净的方式做到这一点?

有趣的部分来了。

df.columns = ['date','number']
print pd.read_json(df.to_json())

        date  number
0 2014-10-01       0
1 2014-10-02       1
2 2014-10-03       2
3 2014-10-04       3
4 2014-10-05       4
5 2014-10-06       5
6 2014-10-07       6

如果我将列的名称更改为“日期”,它会起作用!当然,我希望能够将该列称为与日期不同的名称,所以我仍然有兴趣弄清楚如何管理它。非常感谢! (我使用的是熊猫 0.15.0!)

【问题讨论】:

    标签: python json pandas


    【解决方案1】:

    首先,您在使用to_json 时获得这些数字的原因。 docstring 表示“日期时间对象将转换为 UNIX 时间戳”:

    In [27]: df.to_json()
    Out[27]: '{"LoadDate":{"0":1412121600000,"1":1412208000000,...}}'
    

    所以你看到的数字是 unix 纪元时间戳。但是to_json 有一个date_format 参数,您还可以在其中指定输出ISO 格式的字符串:

    In [19]: df.to_json(date_format='iso')
    Out[19]: '{"LoadDate":{"0":"2014-10-01T00:00:00.000Z","1":"2014-10-02T00:00:00.000Z", ...}}'
    

    然后,第二个,为什么用read_json 的解析是不同的。同样,来自docstring

    convert_dates:布尔值,默认为 True
    要解析日期的列列表;如果为 True,则尝试解析 datelike 列,默认为 True

    默认情况下为 True,因此将尝试检测类似日期的列。显然,此检测还查看列名。但正如文档字符串所说,您也可以手动指定应将哪一列解析为日期:

    In [25]: pd.read_json(df.to_json(), convert_dates=['LoadDate'])
    Out[25]: 
        LoadDate  number
    0 2014-10-01       0
    1 2014-10-02       1
    2 2014-10-03       2
    3 2014-10-04       3
    4 2014-10-05       4
    5 2014-10-06       5
    6 2014-10-07       6
    

    【讨论】:

    • 非常感谢 joris - 这解释了大部分!不幸的是,在我的情况下,我无法指定需要将哪些列转换为日期(以上是一个简化问题),并且由于 LoadDate 最初是 datetime64[ns] 我希望它在从 json 读回时选择它。使用 pandas.DataFrame.to_csv() 然后 pandas.DataFrame.from_csv() 我可以保存和加载具有相同日期规范的 pandas 数据框,我想要做的......在 JSON 中是相同的。有什么想法吗?
    • 在我的最后一个示例中,该列返回为 datetime64。但同样在read_csv 中,您必须指定要解析为日期的列(parse_dates 参数there),所以我认为这个帐户没有区别?
    • 你是对的,没有区别。我虽然做到了 - 非常感谢大家! :D
    猜你喜欢
    • 2020-05-28
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 2020-08-02
    • 1970-01-01
    • 2016-08-18
    • 2018-06-23
    相关资源
    最近更新 更多