V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
yagamil
V2EX  ›  Python

pandas dataframe 时间作为索引时 如何转化为日期而非时间?

  •  
  •   yagamil · 2022-03-04 01:46:14 +08:00 · 2398 次点击
    这是一个创建于 1031 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码是这样的

    数据长这样的:

    1

    图裂了 http://xximg.30daydo.com/picgo/20220304_001.png

    然后

    df = _df.set_index(['净值日期','code']).unstack()['日增长率']
    df.index = pd.to_datetime(df.index,format='%Y-%m-%d')
    print(df.head())
    

    后面数据变成这样的:

    2

    http://xximg.30daydo.com/picgo/20220304_002.png

    如果要获取某一天的数据,通过索引 df['2021-01-01'] 是会报错,说 key 不存在,而用 df['2021-01-01 00:00:00'] 也不行

    但按月份索引是可以的 df['2021-01'] 获取 1 月份的数据

    dongxiao
        1
    dongxiao  
       2022-03-04 09:37:53 +08:00
    执行的时候应该有条 warning 信息吧:
    ```FutureWarning: Indexing a DataFrame with a datetimelike index using a single string to slice the rows, like `frame[string]`, is deprecated and will be removed in a future version. Use `frame.loc[string]` instead.
    ```

    所以你应该这么执行:
    ```
    df.loc["2020-01-01"]
    ```
    milkpuff
        2
    milkpuff  
       2022-03-04 11:25:35 +08:00
    可能你真的没有'2021-01-01'这一天的数据。换一天试试?
    yagamil
        3
    yagamil  
    OP
       2022-03-04 11:57:03 +08:00
    @dongxiao 这个试过,是可以的,就是不知道为和不能直接用 df['2022-01-01'] 这种
    yagamil
        4
    yagamil  
    OP
       2022-03-04 11:57:28 +08:00
    @milkpuff 有的,我用 pycharm 对这右边的数据看的
    milkpuff
        5
    milkpuff  
       2022-03-04 14:17:28 +08:00
    奥,我猜,df['2021-01-01']默认从列里面找的,df['2021-01']转换成了 slice 从行里面找的。
    代码在 pandas/core/frame.py -> DataFrame.__getitem__ 中,可以去研究一下。
    Rush9999
        6
    Rush9999  
       2022-03-04 16:41:43 +08:00
    df.index = pd.to_datetime(df.index,).strftime('%Y-%m-%d')
    yagamil
        7
    yagamil  
    OP
       2022-03-04 17:15:48 +08:00
    @Rush9999 这应该可以,不过把时间索引变成了字符串。 比较的没有问题,不过无法进行聚合采样,比如按照年,月的操作
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1022 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:39 · PVG 03:39 · LAX 11:39 · JFK 14:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.