如何将 pandas 数据框导出为 json 并保留原始日期时间格式?

Posted

技术标签:

【中文标题】如何将 pandas 数据框导出为 json 并保留原始日期时间格式?【英文标题】:How to export pandas dataframe into json and retain original datetime format? 【发布时间】: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)

【问题讨论】:

【参考方案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) ``

以上是关于如何将 pandas 数据框导出为 json 并保留原始日期时间格式?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 json 转换为 pandas 数据框?

如何将此嵌套的 JSON 以柱状形式转换为 Pandas 数据框

将 json 转换为 Pandas 数据框

如何将 pandas 数据框转换为 json 以在 django 模板中使用

将 pandas 嵌套的 JSON 结构转换为数据框

如何在不丢失值的情况下将 json 解析为 pandas 数据框? [复制]