【问题标题】:How do I permanently change a Pandas column with to_datetime so I can write to a .json file如何使用 to_datetime 永久更改 Pandas 列,以便写入 .json 文件
【发布时间】:2021-09-28 09:55:54
【问题描述】:

Python 3.9,Win 10 上的 Pandas 1.3.0

嗨,

我有一个 DataFrame (df),其中两列包含 Unix 时间戳(第 0 列和第 6 列,“开放时间”和“关闭时间”)。

          open time    open    high  ...       volume     close time  number of trades
   0  1609459200000  736.42  739.00  ...  27932.69884  1609462799999             22671
   1  1609462800000  734.08  749.00  ...  52336.18779  1609466399999             41712

我使用以下代码将这些重新格式化为 dtype = datetime64:

df.iloc[:,0] = pd.to_datetime(df['open time'], unit='ms')
df.iloc[:,6] = pd.to_datetime(df['close time'], unit='ms')

结果就是我想要的,日期时间精确到毫秒,用 df.head()

查看
               open time    open  ...              close time  number of trades
   0 2021-01-01 00:00:00  736.42  ... 2021-01-01 00:59:59.999             22671
   1 2021-01-01 01:00:00  734.08  ... 2021-01-01 01:59:59.999             41712

但是,当我将其写入 json 文件时,不会保存更改。

df.to_json("ETHUSDT_out_hist1.json", orient="records", indent=2)

生成的 .json 文件内容 - Unix 时间戳仍然存在:

{"open time":1609459200000,
 "open":736.42,
  // 1, 2, skip a few
 "close time":1609462799999,
 "number of trades":22671}

我怀疑我是通过应用 to_datetime 方法而不是更改原始 df 对象来创建副本的。

我的问题是,如何更改原始对象/DataFrame,以便我的更改将保存到 json 文件中? to_datetime 没有就地参数,我似乎无法弄清楚如何将更改分配回原始 df。 拖网几个小时,Pandas 文档和其他论坛也没有找到可行的解决方案。

提前致谢

【问题讨论】:

    标签: python json python-3.x pandas


    【解决方案1】:

    完成所有数据类型转换后,在将数据框写入 json 文件时使用 data_format='iso' 参数:

    df = pd.DataFrame({'open time':[1609459200000, 1609462800000],'close time':[1609462799999, 1609466399999]})
    
    df['open time'] = pd.to_datetime(df['open time'], unit='ms')
    df['close time'] = pd.to_datetime(df['close time'], unit='ms') 
    df.to_json("out_hist1.json", date_format='iso', orient='records') 
    

    查看数据类型在 df 中是如何维护的,在保存到文件之前无需将它们更改为 srings:

    print(df.dtypes) 
    
    >> output >>
    
    Output menu
    open time     datetime64[ns]
    close time    datetime64[ns]
    dtype: object
    

    它通过输出文件中的记录来保持方向:

    %%bash
    head out_hist1.json
    
    [
    {"open time":"2021-01-01T00:00:00.000Z","close time":"2021-01-01T00:59:59.999Z"},
    {"open time":"2021-01-01T01:00:00.000Z","close time":"2021-01-01T01:59:59.999Z"}
    ]
    
    

    【讨论】:

      【解决方案2】:

      根据 Pandas 文档,to_json 将时间戳转换为 UNIX https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_json.html?highlight=to_json,因此在处理 json 时将其从 UNIX 转换回时间戳,或转换为字符串。例如:

      df = pd.DataFrame({'open time':[1609459200000, 1609462800000],'close time':[1609462799999, 1609466399999]})
      
      df['open time'] = pd.to_datetime(df['open time'], unit='ms').astype(str)
      df['close time'] = pd.to_datetime(df['close time'], unit='ms').astype(str)
      
      df.to_json("ETHUSDT_out_hist1.json", orient="records") # , indent=2)
      
      

      获取json:

      {"open time":{"0":"2021-01-01 00:00:00","1":"2021-01-01 01:00:00"},"close time":{"0":"2021-01-01 00:59:59.999","1":"2021-01-01 01:59:59.999"}}
      

      【讨论】:

      • 谢谢,转换回字符串是可行的,事后看来,我自己也可以想到这一点。事实证明,我确实需要保留 'orient = "records" 参数,否则它会先写入所有第 0 列,然后是第 1 列,&c。 --> 我需要好的记录。
      • 太棒了,我编辑了我的答案以使用记录。你能接受我的回答吗?
      【解决方案3】:

      底层类型在 JSON 中保持为 long int。为了看到像:2021-01-01 00:00:00 这样的值,您必须将其转换为字符串:

      df['open time'] = df['open time'].apply(str, axis=1)
      df['open time'] = df['close time'].apply(str, axis=1)
      

      【讨论】:

        猜你喜欢
        • 2020-02-12
        • 2015-06-21
        • 2023-02-15
        • 1970-01-01
        • 2014-06-01
        • 1970-01-01
        • 2023-03-12
        • 2016-12-25
        • 1970-01-01
        相关资源
        最近更新 更多