【问题标题】:How to export pandas dataframe into json and retain original datetime format?如何将 pandas 数据框导出为 json 并保留原始日期时间格式?
【发布时间】:2021-06-02 18:56:49
【问题描述】:

我正在处理一个数据集,我应用 to_json() 方法将 pandas 数据框导出到 json 文件中。然后我将使用这个 json 文件上传到 MongoDB。但是我意识到日期时间格式已转换为纪元时间戳。 如何在导出到 JSON 文件以及将 json 文件上传到 MongoDB 时保留日期时间格式?另外,我不希望 json 输出中出现空字段。

df:

    user_id     datetime
0   69490717    [{'checkin_date': 2021-02-01 00:00:00}]
1   67125777    [{'checkin_date': 2021-02-01 00:00:00}]
2   62747294    NaN
3   63216896    [{'checkin_date': 2021-02-01 00:00:00}]
4   51466797    [{'checkin_date': 2021-01-31 00:00:00}]
... ... ...
96  82758550    NaN
97  44662827    NaN
98  36376189    [{'checkin_date': 2021-01-18 00:00:00}]
99  71910948    [{'checkin_date': 2021-01-18 00:00:00}, {'checkout_date': 2021-01-20 00:00:00}]
100 54620533    NaN

json 输出片段:

[{"user_id":62507249,"datetime":[{"checkin_date":1612051200000},{"checkout_date":1612051200000}]}, 
{"user_id":69546481,"datetime":[{"checkin_date":1612051200000}]}, ......]

以下是我转换为 json 的代码:

jsonresult = df.T.apply(lambda row: row[~row.isnull()].to_json())
json_wrapped = "[%s]" % ",".join(jsonresult)

# write JSON to file
with open('jsonresult.json', 'w') as f:
    f.write(json_wrapped)

【问题讨论】:

    标签: python json pandas mongodb datetime


    【解决方案1】:

    您需要使用Series.astypedatetime 列转换为string

    df['datetime'] = df['datetime'].astype(str)
    

    另外,您不需要将其转换为json 的代码。您可以执行以下操作:

    jsonresult  = df.to_json(orient='records')
    

    【讨论】:

    • 嗨,很抱歉,我不得不编辑问题以更好地呈现实际问题
    【解决方案2】:

    我认为您需要DataFrame.to_json 中的date_format='iso' 参数,并且可以使用DataFrame.dropna 删除具有缺失值的行:

    a = [{"user_id":1,"datetime":[{"checkin_date":pd.Timestamp('2021-02-01 00:00:00')},
                                         {"checkout_date":pd.Timestamp('2021-02-01 00:00:00')}]},
         {"user_id":2,"datetime":[{"checkin_date":pd.Timestamp('2021-02-01 00:00:00')}]},
         {"user_id":4,"datetime": np.nan}]
    df = pd.DataFrame(a)
    print (df)
       user_id                                           datetime
    0        1  [{'checkin_date': 2021-02-01 00:00:00}, {'chec...
    1        2            [{'checkin_date': 2021-02-01 00:00:00}]
    2        4                                                NaN
    

    jsonresult = df.dropna(subset=['datetime']).to_json(date_format='iso', orient='records')
    print (jsonresult)
    [{"user_id":1,"datetime":[{"checkin_date":"2021-02-01T00:00:00.000Z"},
                              {"checkout_date":"2021-02-01T00:00:00.000Z"}]},
     {"user_id":2,"datetime":[{"checkin_date":"2021-02-01T00:00:00.000Z"}]}]
    

    dictresult = df.dropna(subset=['datetime']).to_dict(orient='records')
    print (dictresult)
    [{'user_id': 1, 'datetime': [{'checkin_date': Timestamp('2021-02-01 00:00:00')},
                                 {'checkout_date': Timestamp('2021-02-01 00:00:00')}]}, 
     {'user_id': 2, 'datetime': [{'checkin_date': Timestamp('2021-02-01 00:00:00')}]}]
    

    【讨论】:

    • 嗨,您回答的第一部分在一定程度上有所帮助,它基本上保留了日期格式,但它将日期数据类型转换为字符串,因此当我将 json 文件上传到 MongoDB 时,日期在字符串格式而不是日期时间。如何保留日期时间格式?
    • 我的错,我刚刚意识到我没有在我的问题中指定我正在将 json 文件上传到 MongoDB。将相应地编辑我的问题
    • @snow - 嗯,如果需要 json,那么所有数据都将转换为字符串,所以那里没有日期时间。
    • @snow - 可能的解决方案是将值转换为字典,例如将 .to_json(date_format='iso', orient='records') 更改为 .to_dict(orient='records')
    • 我试过了,它返回给我一个字典和字符串列表,但我无法写入 json。错误:TypeError:write() 参数必须是 str,而不是 list ```` with open('jsonresult.json', 'w') as f: f.write(dictresult) ``
    猜你喜欢
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 2018-09-18
    • 2020-06-18
    • 1970-01-01
    • 2021-09-02
    • 2019-08-11
    • 1970-01-01
    相关资源
    最近更新 更多