Python pandas提取每日首条/聚合同日期数据及报错解决
报错原因
触发AttributeError: Can only use .str accessor with string values!是因为你通过x.date()生成的Time列是Python原生date类型,不是字符串类型,无法调用.str字符串处理接口,完全没必要用正则提取日期,属于多走了弯路。
最优实现流程
第一步:规范加载JSON数据
你的JSON是嵌套结构,加载时直接扁平化处理,从根源避免多级列名带来的冗余操作:
import pandas as pd import json # 替换为你的JSON文件实际路径 with open("nft_floor_data.json", "r", encoding="utf-8") as f: raw = json.load(f) # 直接生成绘图用的标准基础表 df = pd.DataFrame({ "datetime": pd.to_datetime(raw["data"]["date"]), "Floor Price (ETH)": raw["data"]["datasets"] })
第二步:二选一完成日维度聚合
两种逻辑都不需要额外生成字符串日期列,直接用pandas datetime类型自带的.dt.date接口按天分组即可。
- 方案1:提取每日首条记录
# 取每日第一条数据,要取最后一条把.first()换成.last()即可 df_daily = df.groupby(df["datetime"].dt.date, as_index=False).first() df_daily = df_daily.rename(columns={"datetime": "Date"})
- 方案2:按日计算价格均值
df_daily = df.groupby(df["datetime"].dt.date, as_index=False).agg({ "Floor Price (ETH)": "mean" }) df_daily = df_daily.rename(columns={"datetime": "Date"})
原有代码修正版
如果你不想调整现有数据加载逻辑,保留原有data.date、data.datasets列结构,直接删掉冗余的正则提取步骤即可:
df["data.date"] = pd.to_datetime(df["data.date"]) # 首条记录逻辑 df_daily = df.groupby(df["data.date"].dt.date, as_index=False).agg( Date=("data.date", "first"), "Floor Price (ETH)": ("data.datasets", "first") ).reset_index(drop=True) # 均值逻辑替换agg内规则即可 # df_daily = df.groupby(df["data.date"].dt.date, as_index=False).agg( # Date=("data.date", "first"), # "Floor Price (ETH)": ("data.datasets", "mean") # ).reset_index(drop=True)
最终输出的表只有
Date、Floor Price (ETH)两列,可直接传入任意Python绘图库绘制折线图、柱状图,无需额外格式转换。
内容的提问来源于stack exchange,提问作者akira
相关产品推荐
相关产品推荐

