新手求助!关于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:} 2011-02-01也没数据啊 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 老阿訇 发表于 2021-5-29 10:00
有的哈,dingtou1这个变量里面的时间区间是这样的:
close net value
试试这个呢
# 获取每月第一天的数据
df_.resample("M").first().head() wp231957 发表于 2021-5-29 10:08
试试这个呢
# 获取每月第一天的数据
df_.resample("M").first().head()
不行诶,只是提取了前5个日期而已,都还是每月末的
可以用分组函数 groupby 按月分组后筛选每个月第一个数据即可
Twilight6 发表于 2021-5-29 10:54
可以用分组函数 groupby 按月分组后筛选每个月第一个数据即可
代码具体怎么实现呢?能不能麻烦给个例子{:10_277:} 老阿訇 发表于 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)) 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: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: 有时多浏览一下可选参数有哪些,你就可以了解常用的使用场景有哪些。
阿奇_o 发表于 2021-5-29 14:36
“股票交易日”肯定是星期一,这样的“工作日”咯,那直接用 “BMS” ,就搞定了
比如,
谢谢,不过这样发现一个问题,比如说2014/2/7是当月的首个交易日,但因为2/3是周一,所以按照你的方法的话,程序跑起来会把excel里2/7的收盘价自动变成2/3的收盘价额{:10_277:} 本帖最后由 阿奇_o 于 2021-5-29 16:02 编辑
老阿訇 发表于 2021-5-29 15:31
谢谢,不过这样发现一个问题,比如说2014/2/7是当月的首个交易日,但因为2/3是周一,所以按照你的方法的 ...
特殊的节假日,你必须手动排除过滤掉或者补数据,没别的好办法。
像我们有春节、清明、中秋等农历节假日,都是根据官方公布次年节假日后来调整偏差的,每年都会有所不同。 老阿訇 发表于 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))
Twilight6 发表于 2021-5-29 21:28
这样试试看,如果还是不行,去打开 csv 源文件拷贝几行发上来:
大神厉害啊,搞定了! 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]