【问题标题】:Converting a list into JSON with timestamp将列表转换为带有时间戳的 JSON
【发布时间】:2018-04-26 23:11:29
【问题描述】:

我有一个这样的字典列表:

  [{'accounts': [{'account_number': 'xx6747',
  'bank_name': 'Fargo Bank',
  'bankid': 85,
  'created_date_y': Timestamp('2015-05-20 08:08:33'),
  'item_account_id': 20086385.0,
  'item_id': 17764259,
  'user_id': 18},
  {'account_number': '*819',
 'bank_name': 'Central Alabama - Bank',
 'bankid': 88,
 'created_date_y': Timestamp('2015-05-20 08:08:33'),
 'item_account_id': 20637127.0,
 'item_id': 17761624,
 'user_id': 18},
 {'account_number': '*056',
'bank_name': 'Central Alabama - Bank',
'bankid': 88,
'created_date_y': Timestamp('2015-05-20 08:08:33'),
'item_account_id': 20087284.0,
'item_id': 17761624,
'user_id': 18},
'created_date_x': Timestamp('2014-03-11 10:48:42'),
'id': 18,
'password': 'NjgrUW9URGZz09',
'status': 1,
'uid': 97560,
'username': 'pepass@yahoo.com'},
{'accounts': [{'account_number': 791,
'bank_name': 'Chase - Bank',
'bankid': 855,
'created_date_y': Timestamp('2015-05-20 08:03:37'),
'item_account_id': 20090104.0,
'item_id': 17764260,
'user_id': 20},
{'account_number': 883,
'bank_name': 'Chase - Bank',
'bankid': 852,
'created_date_y': Timestamp('2015-05-20 08:03:37'),
'item_account_id': 20090105.0,
'item_id': 17764260,
'user_id': 20}],
'created_date_x': Timestamp('2014-03-11 13:42:20'),
'id': 20,
'password': 'bmJlbTN5dFo5QT09',
'status': 1,
'uid': 99408,
'username': 'hor@sanstore.com'}]

它还包含其他项目。 created_date_xcreated_date_y 是时间戳。 我想将此列表转换为嵌套字典,如下所示:

 {'id': 18,
  'password': 'NjgrUW9URGZz09',
  'status': 1,
  'uid': 97560,
  'username': 'pepass@yahoo.com'},
  'created_date_x': Timestamp('2014-03-11 10:48:42')
{'accounts': 
       [{'account_number': 'xx6747',
       'bank_name': 'Fargo Bank',
       'bankid': 85,
       'created_date_y': Timestamp('2015-05-20 08:08:33'),
       'item_account_id': 20086385.0,
       'item_id': 17764259,
       'user_id': 18},
      {'account_number': '*819',
       'bank_name': 'Central Alabama - Bank',
       'bankid': 88,
       'created_date_y': Timestamp('2015-05-20 08:08:33'),
       'item_account_id': 20637127.0,
       'item_id': 17761624,
       'user_id': 18},
      {'account_number': '*056',
       'bank_name': 'Central Alabama - Bank',
       'bankid': 88,
       'created_date_y': Timestamp('2015-05-20 08:08:33'),
       'item_account_id': 20087284.0,
       'item_id': 17761624,
       'user_id': 18}]}}

将其转换为字典后,我想将其转换为 JSON。将其转换为 json 的问题是 timestamp 字段给出的错误为 timestamp is not json serializale。到目前为止我没有按我想要的那样工作的代码是:

 import pandas as pd
 #importing files
 df1 = pd.read_excel("C:\\Users\\Desktop\\yod_user.xlsx")
 df2 = pd.read_excel("C:\\Users\\Desktop\\yod_bank.xlsx")

 df1['created_date'] = df1['created_date'].astype(str)
 df2['created_date'] = df2['created_date'].astype(str)

 df1.dtypes
 #id               int64
 #username        object
 #password        object
 #uid              int64
 #created_date    object
 #status           int64
 #dtype: object
 df2.dtypes
 #user_id              int64
 #bankid                      int64
 #account_number             object
 #item_id              int64
 #item_account_id    float64
 #created_date               object
 #bank_name                  object
 #dtype: object

 df_merge = pd.merge(df1, df2, left_on = 'id', right_on ='user_id', how ='inner')
 df_merge.dtypes
 #id                        object
 #username                  object
 #password                  object
 #uid                       object
 #created_date_x            object
 #status                    object
 #user_id                   object
 #bankid                    object
 #account_number            object
 #item_id                   object
 #item_account_id           object
 #created_date_y            object
 #bank_name                 object
 #dtype: object
j = df_merge.groupby(['id', 'username', 'password',   'uid',created_date_x',  'status'], as_index=False)\
         .apply(lambda x: x[['account_number','user_id','bankid', 'item_id', 'item_account_id','created_date_y', 'bank_name' ]].to_dict('r'))\
         .reset_index()\
         .rename(columns={0:'accounts'})\

 j.dtypes
 #id                 int64
 #username          object
 #password          object
 #uid                int64
 #created_date_x    object
 #status             int64
 #accounts          object
 #dtype: object
 jdict = j.to_dict('records')

 import json
 json.dumps(jdict) #This gives an error: TypeError: Object of type     'Timestamp' is not JSON serializable

如果初始列表可以转换成json之类的字典也行。请帮忙。

【问题讨论】:

  • Timestamp 是第三方模块吗?你自己定义了吗?
  • df1df2 是 MySQL 中存储在 excel 中并导入 python 的表。 astype 不起作用
  • 您需要实际分配类型更改:df1['created_date'] = df1['created_date'].astype(str)。然后你在转换to_dict()时会有日期字符串。
  • 需要转换created_date_x吗?
  • 我有两列同名created_date。当我合并它们时,_x_y 被添加到它们中。它们已经是一个对象。'

标签: python json pandas


【解决方案1】:

使用astype() 会起作用。在您的代码中,您实际上并没有更改日期列的 dtype

你有:

 df1['created_date'].astype(str)

你需要:

 df1['created_date'] = df1['created_date'].astype(str)

例子:

dates = pd.date_range("2000","2002",freq="A")
data = {"created_date":dates, "value":range(len(dates))}
df = pd.DataFrame(data)

df
  created_date  value
0   2000-12-31      0
1   2001-12-31      1

(df["created_date"].dtype
# datetime64[ns]

df["created_date"] = df["created_date"].astype(str)

df["created_date"].dtype
# object

json.dumps(df.to_dict('records'))
# '[{"created_date": "2000-12-31", "value": 0}, 
    {"created_date": "2001-12-31", "value": 1}]'

【讨论】:

  • 我做到了,但是当我尝试将其转储为 json 时,它仍然给出相同的错误。在转换为 json 之前如何检查它的数据类型
  • 检查.dtype。我添加了一个示例。
  • df1['created_date'] = df1['created_date'].astype(str) df1['created_date'].dtype dtype('O')。它给了我这个,但它不会转换为 json。
  • 不清楚你在这里的意思。您是说您在Timestamp 上遇到的错误与您最初的错误相同吗?如果是这样,您将丢失数据中某些其他日期或时间字段的转换。使用df.dtypes 找出日期,并确保它们都已转换。 (或者只是做df.astype(str)。)
  • 是的,时间戳不是 json 可序列化的相同错误。我将所有 dtypes 作为 int64、object 或 float。我应该全部转换成str?
【解决方案2】:

解决这个问题的一个简单方法是完全避免使用Timestamp。除了调用Timestamp,您还可以使用内置的datetime 模块并创建一个返回实际数字时间戳的函数。例如

from datetime import datetime
from pytz import utc 

def timestamp_from_str(date_str):

    date = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S') 
    return date.replace(tzinfo=utc).timestamp()

请注意,.timestamp 方法在 Python 2.7 中不可用,在这种情况下,您必须手动计算时间戳。这是一个简单的过程,但我不会在这里提及它,因为它已经被another question深入描述过。

【讨论】:

  • AttributeError: module 'datetime' has no attribute 'strptime'。我正在使用 python 3
  • 您使用的是import datetime 还是from datetime import datetime?第一个会抛出错误,但第二个会起作用。
  • 是的,我做到了。定义函数并传递df1['created_date']。仍然,得到了错误。
  • 抱歉 - tzinfo 有错字。对于我自己和我左边的大学,复制并粘贴上述定义适用于函数调用timestamp_from_str('2015-05-20 08:08:33')
  • 它不起作用兄弟。同样的错误。我将使用 dtypes 和其他的输出来编辑问题。
猜你喜欢
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 2019-08-20
  • 1970-01-01
  • 2018-07-15
  • 2021-06-25
  • 2018-11-30
相关资源
最近更新 更多