如何将 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.astype
将datetime
列转换为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 数据框