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
moogle
V2EX  ›  Python

pandas 里关于日期的处理

  •  
  •   moogle · 2015-12-24 22:32:30 +08:00 · 6771 次点击
    这是一个创建于 3256 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近想玩玩 tushare ,有几个问题:
    1 、比如我从 csv 中读入股票的数据,存入到 DataFrame 里: df=pd.read_csv(FileDir, index_col="date", encoding='gbk')。此时 date 作为 index ,那么之后调用排序 df.sort_values 就无法使用 date 进行。只能选用其它 column (比如 open 、 close 等)进行排序。也就是说 df.sort_values(by=['date'])出错,而 df.sort_values(by=['close'])正常。
    所以目前我只能修改为 df=pd.read_csv(FileDir, encoding='gbk'),这样 df 的数据就类似于:
    date open high close low volume price_change p_change \
    0 2015-12-22 25.45 25.60 25.34 24.83 23069.91 -0.10 -0.39
    1 2015-12-21 25.65 25.95 25.44 25.01 34771.50 -0.42 -1.62
    这时 index 就是从 0 开始的整数。如果调用 df.sort_values(by=['date']), index 也会相应调整成这样:
    date open high close low volume price_change p_change \
    584 2012-12-24 5.40 5.44 5.41 5.35 5436.09 0.01 0.18
    583 2012-12-25 5.41 5.58 5.52 5.36 17887.64 0.11 2.03
    但是我希望 index 不参与排序
    2 、我想对 df 的 open 或者 close 数据画图,比如 x 轴为 date , y 轴为 open ,日期该如何转换?
    因为我直接调用 plt.plot(df['date'], df['close'])就会出错。
    10 条回复    2015-12-30 08:29:06 +08:00
    yech1990
        1
    yech1990  
       2015-12-24 23:27:12 +08:00
    1. df.index=range(len(df.index))

    2. pd.to_datetime
    moogle
        2
    moogle  
    OP
       2015-12-25 23:50:55 +08:00
    谢谢楼上,可以了。
    继续 1 里面的问题,如果我想让日期作为 index ,也就是 df=pd.read_csv(FileDir, index_col="date", encoding='gbk'),那 df 如何使用日期进行排序?
    ahxxm
        3
    ahxxm  
       2015-12-26 14:54:43 +08:00
    如果你的 index 已经长得像日期了, df.index = pd.DatetimeIndex(df.index); df = df.sort_index() ,如果 index 还是某个叫做 date 的 column ,就先 df.index = pd.DatetimeIndex(df.pop('date'))
    moogle
        4
    moogle  
    OP
       2015-12-26 22:39:12 +08:00
    好的,完全解决问题了!
    wgwang
        5
    wgwang  
       2015-12-27 15:02:07 +08:00
    read_csv 的时候,可以不指定 index_col, 读完后用 df.set_index('date', drop=False)
    这样把 date 列冗余了,方便后续的处理。

    @moogle 玩 tushare ,是准备搞股票么?
    bian
        6
    bian  
       2015-12-27 21:58:30 +08:00
    fdsaf
    bomb77
        7
    bomb77  
       2015-12-27 23:32:38 +08:00
    1122233
    moogle
        8
    moogle  
    OP
       2015-12-27 23:48:50 +08:00
    @ahxxm
    再看了一下,不指定 index_col ,则 df 的 index 是 python 的 object ,所以“ index 已经长得像日期了”,因此不能用 sort_value 。
    不过后半句没看懂。。

    @wgwang
    业务爱好,准备学习一下。但是也不知道能做成什么样?因为看到有很多进行量化分析的。
    billgreen1
        9
    billgreen1  
       2015-12-29 23:01:58 +08:00
    @moogle read_csv 有个参数, parse_dates=True ,这样的 index 是 DatetimeIndex 。
    ahxxm
        10
    ahxxm  
       2015-12-30 08:29:06 +08:00
    @moogle 就比如你的 dataframe 长这样

    \ A 'date' B C
    1
    2
    3

    这个时候可以 pop('date')同时转换……
    楼上提到的 parse_dates 印象里接受 col_name ,不过刚看了下源代码, True 时会把 index 处理成 DatetimeIndex 。
    pandas 里的黑魔法太多了,建议还是手动来比较好, pandas 版本升级了不容易出错,出错了也知道应该怎么改。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1631 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:57 · PVG 00:57 · LAX 08:57 · JFK 11:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.