pandas 里关于日期的处理

2015-12-24 22:32:30 +08:00
 moogle
最近想玩玩 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'])就会出错。
6807 次点击
所在节点    Python
10 条回复
yech1990
2015-12-24 23:27:12 +08:00
1. df.index=range(len(df.index))

2. pd.to_datetime
moogle
2015-12-25 23:50:55 +08:00
谢谢楼上,可以了。
继续 1 里面的问题,如果我想让日期作为 index ,也就是 df=pd.read_csv(FileDir, index_col="date", encoding='gbk'),那 df 如何使用日期进行排序?
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
2015-12-26 22:39:12 +08:00
好的,完全解决问题了!
wgwang
2015-12-27 15:02:07 +08:00
read_csv 的时候,可以不指定 index_col, 读完后用 df.set_index('date', drop=False)
这样把 date 列冗余了,方便后续的处理。

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

@wgwang
业务爱好,准备学习一下。但是也不知道能做成什么样?因为看到有很多进行量化分析的。
billgreen1
2015-12-29 23:01:58 +08:00
@moogle read_csv 有个参数, parse_dates=True ,这样的 index 是 DatetimeIndex 。
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 版本升级了不容易出错,出错了也知道应该怎么改。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/245953

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX