老阿訇 发表于 2021-5-29 09:46:28

新手求助!关于pandas日期重新筛选的问题

>>> dingtou_m = dingtou1.resample('M').first()
>>> print(dingtou_m)
               closenet value
date                           
2011-01-313189.682   3.189682
2011-02-283077.283   3.077283
2011-03-313254.893   3.254893
2011-04-303272.729   3.272729
2011-05-313211.132   3.211132
2011-06-303004.173   3.004173
2011-07-313049.745   3.049745
2011-08-312977.721   2.977721
2011-09-302834.535   2.834535
2011-10-312557.082   2.557082
2011-11-302697.534   2.697534
2011-12-312583.613   2.583613
2012-01-312298.753   2.298753


请教下各位大神,我想在一段交易日区间内筛选出每月首个交易日(比如2011年2月的首个交易日应该是2011-02-01),为什么输出结果却是2011-02-28呢?应该怎么解决呢?{:10_277:} {:10_277:}

wp231957 发表于 2021-5-29 09:51:59

2011-02-01也没数据啊

老阿訇 发表于 2021-5-29 10:00:33

wp231957 发表于 2021-5-29 09:51
2011-02-01也没数据啊

有的哈,dingtou1这个变量里面的时间区间是这样的:

                  close    net value
date                           
2011-01-043189.6820   3.189682
2011-01-053175.6620   3.175662
2011-01-063159.6430   3.159643
2011-01-073166.6240   3.166624
2011-01-103108.1870   3.108187
...               ...      ...
2020-12-255042.0137   5.042014
2020-12-285064.4147   5.064415
2020-12-295042.9361   5.042936
2020-12-305113.7105   5.113710
2020-12-315211.2885   5.211289

wp231957 发表于 2021-5-29 10:08:38

老阿訇 发表于 2021-5-29 10:00
有的哈,dingtou1这个变量里面的时间区间是这样的:

                  close    net value


试试这个呢
# 获取每月第一天的数据
df_.resample("M").first().head()

老阿訇 发表于 2021-5-29 10:10:56

wp231957 发表于 2021-5-29 10:08
试试这个呢
# 获取每月第一天的数据
df_.resample("M").first().head()

不行诶,只是提取了前5个日期而已,都还是每月末的

Twilight6 发表于 2021-5-29 10:54:25



可以用分组函数 groupby 按月分组后筛选每个月第一个数据即可

老阿訇 发表于 2021-5-29 11:29:28

Twilight6 发表于 2021-5-29 10:54
可以用分组函数 groupby 按月分组后筛选每个月第一个数据即可

代码具体怎么实现呢?能不能麻烦给个例子{:10_277:}

Twilight6 发表于 2021-5-29 12:39:45

老阿訇 发表于 2021-5-29 11:29
代码具体怎么实现呢?能不能麻烦给个例子


参考代码:

import pandas as pd

df = pd.read_excel('你的文件')
df.sort_values("date",ascending=True, inplace=True)
a = df.groupby(pd.Grouper(key="date",freq='M'))
print(a.head(1))

老阿訇 发表于 2021-5-29 13:35:21

Twilight6 发表于 2021-5-29 12:39
参考代码:

import pandas as pd

dingtou = pd.read_csv('000300.csv')

dingtou.set_index('date',inplace=True)

dingtou.index = pd.to_datetime(dingtou.index).floor('D')

print(dingtou)

#
                closenet value
date                           
2011-01-043189.6820   3.189682
2011-01-053175.6620   3.175662
2011-01-063159.6430   3.159643
2011-01-073166.6240   3.166624
2011-01-103108.1870   3.108187
...               ...      ...
2020-12-255042.0137   5.042014
2020-12-285064.4147   5.064415
2020-12-295042.9361   5.042936
2020-12-305113.7105   5.113710
2020-12-315211.2885   5.211289
#

dingtou.sort_values("date",ascending=True, inplace=True)

dingtou_m = dingtou.groupby(pd.Grouper(key="date",freq='M'))# KeyError: 'The grouper name date is not found'

最底下这行报错了,是啥原因呢?

阿奇_o 发表于 2021-5-29 14:36:52

本帖最后由 阿奇_o 于 2021-5-29 14:38 编辑

“股票交易日”肯定是星期一,这样的“工作日”咯,那直接用 “BMS” ,就搞定了
比如,
index = pd.date_range('2011/1/1', periods=100, freq='D')
ts = pd.Series(np.random.randint(0, 500, len(index)), index=index)

ts.resample('BMS').first()# 'BMS':每月第一个工作日(常用在股票交易等场景)
ts.resmaple('MS').first()   # 'MS':每月第一个日历日(每月1号)
# 注:.first()不是指实际意义上的第一天,而是指“重采样”后的第一个数据

ps: 有时多浏览一下可选参数有哪些,你就可以了解常用的使用场景有哪些。

老阿訇 发表于 2021-5-29 15:31:37

阿奇_o 发表于 2021-5-29 14:36
“股票交易日”肯定是星期一,这样的“工作日”咯,那直接用 “BMS” ,就搞定了
比如,



谢谢,不过这样发现一个问题,比如说2014/2/7是当月的首个交易日,但因为2/3是周一,所以按照你的方法的话,程序跑起来会把excel里2/7的收盘价自动变成2/3的收盘价额{:10_277:}

阿奇_o 发表于 2021-5-29 15:54:53

本帖最后由 阿奇_o 于 2021-5-29 16:02 编辑

老阿訇 发表于 2021-5-29 15:31
谢谢,不过这样发现一个问题,比如说2014/2/7是当月的首个交易日,但因为2/3是周一,所以按照你的方法的 ...

特殊的节假日,你必须手动排除过滤掉或者补数据,没别的好办法。
像我们有春节、清明、中秋等农历节假日,都是根据官方公布次年节假日后来调整偏差的,每年都会有所不同。

Twilight6 发表于 2021-5-29 21:28:02

老阿訇 发表于 2021-5-29 13:35
import pandas as pd

dingtou = pd.read_csv('000300.csv')




这样试试看,如果还是不行,去打开 csv 源文件拷贝几行发上来:

import pandas as pd

dingtou = pd.read_csv('000300.csv')

dingtou.sort_values("date",ascending=True, inplace=True)
dingtou["date"] = pd.to_datetime(dingtou["date"])
dingtou_m = dingtou.groupby(pd.Grouper(key="date",freq='M'))

print(dingtou_m.head(1))

老阿訇 发表于 2021-5-29 21:52:05

Twilight6 发表于 2021-5-29 21:28
这样试试看,如果还是不行,去打开 csv 源文件拷贝几行发上来:

大神厉害啊,搞定了!

老阿訇 发表于 2021-6-5 11:30:39

Twilight6 发表于 2021-5-29 21:28
这样试试看,如果还是不行,去打开 csv 源文件拷贝几行发上来:

再麻烦问下,我把这个生成字典后发现key的日期都是datetime格式的,想问问看怎么变成str格式呢?
import pandas as pd
import numpy as np

def month_firstday():
    dingtou = pd.read_csv('000300.csv')

    dingtou.sort_values("date",ascending=True, inplace=True)
    dingtou["date"] = pd.to_datetime(dingtou["date"])
    dingtou_m = dingtou.groupby(pd.Grouper(key="date",freq='M'))
    dict2 = dingtou_m.head(1).set_index('date')['close'].to_dict()
    return dict2

month_firstday()
页: [1]
查看完整版本: 新手求助!关于pandas日期重新筛选的问题