鱼C论坛

 找回密码
 立即注册
查看: 2844|回复: 14

[已解决]新手求助!关于pandas日期重新筛选的问题

[复制链接]
发表于 2021-5-29 09:46:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
>>> dingtou_m = dingtou1.resample('M').first()
>>> print(dingtou_m)
               close  net value
date                           
2011-01-31  3189.682   3.189682
2011-02-28  3077.283   3.077283
2011-03-31  3254.893   3.254893
2011-04-30  3272.729   3.272729
2011-05-31  3211.132   3.211132
2011-06-30  3004.173   3.004173
2011-07-31  3049.745   3.049745
2011-08-31  2977.721   2.977721
2011-09-30  2834.535   2.834535
2011-10-31  2557.082   2.557082
2011-11-30  2697.534   2.697534
2011-12-31  2583.613   2.583613
2012-01-31  2298.753   2.298753


请教下各位大神,我想在一段交易日区间内筛选出每月首个交易日(比如2011年2月的首个交易日应该是2011-02-01),为什么输出结果却是2011-02-28呢?应该怎么解决呢?
最佳答案
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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-29 09:51:59 From FishC Mobile | 显示全部楼层
2011-02-01也没数据啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-29 10:00:33 | 显示全部楼层
wp231957 发表于 2021-5-29 09:51
2011-02-01也没数据啊

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

                  close    net value
date                           
2011-01-04  3189.6820   3.189682
2011-01-05  3175.6620   3.175662
2011-01-06  3159.6430   3.159643
2011-01-07  3166.6240   3.166624
2011-01-10  3108.1870   3.108187
...               ...        ...
2020-12-25  5042.0137   5.042014
2020-12-28  5064.4147   5.064415
2020-12-29  5042.9361   5.042936
2020-12-30  5113.7105   5.113710
2020-12-31  5211.2885   5.211289
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-29 10:08:38 From FishC Mobile | 显示全部楼层
老阿訇 发表于 2021-5-29 10:00
有的哈,dingtou1这个变量里面的时间区间是这样的:

                  close    net value

试试这个呢
# 获取每月第一天的数据
df_.resample("M").first().head()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-29 10:10:56 | 显示全部楼层
wp231957 发表于 2021-5-29 10:08
试试这个呢
# 获取每月第一天的数据
df_.resample("M").first().head()

不行诶,只是提取了前5个日期而已,都还是每月末的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-29 10:54:25 | 显示全部楼层


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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-29 11:29:28 | 显示全部楼层
Twilight6 发表于 2021-5-29 10:54
可以用分组函数 groupby 按月分组后筛选每个月第一个数据即可

代码具体怎么实现呢?能不能麻烦给个例子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-29 13:35:21 | 显示全部楼层

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)

#
                close  net value
date                           
2011-01-04  3189.6820   3.189682
2011-01-05  3175.6620   3.175662
2011-01-06  3159.6430   3.159643
2011-01-07  3166.6240   3.166624
2011-01-10  3108.1870   3.108187
...               ...        ...
2020-12-25  5042.0137   5.042014
2020-12-28  5064.4147   5.064415
2020-12-29  5042.9361   5.042936
2020-12-30  5113.7105   5.113710
2020-12-31  5211.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'

最底下这行报错了,是啥原因呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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: 有时多浏览一下可选参数有哪些,你就可以了解常用的使用场景有哪些。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-29 15:31:37 | 显示全部楼层
阿奇_o 发表于 2021-5-29 14:36
“股票交易日”肯定是星期一,这样的“工作日”咯,那直接用 “BMS” ,就搞定了
比如,

谢谢,不过这样发现一个问题,比如说2014/2/7是当月的首个交易日,但因为2/3是周一,所以按照你的方法的话,程序跑起来会把excel里2/7的收盘价自动变成2/3的收盘价额
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-29 15:54:53 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-5-29 16:02 编辑
老阿訇 发表于 2021-5-29 15:31
谢谢,不过这样发现一个问题,比如说2014/2/7是当月的首个交易日,但因为2/3是周一,所以按照你的方法的 ...


特殊的节假日,你必须手动排除过滤掉或者补数据,没别的好办法。
像我们有春节、清明、中秋等农历节假日,都是根据官方公布次年节假日后来调整偏差的,每年都会有所不同。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-29 21:52:05 | 显示全部楼层
Twilight6 发表于 2021-5-29 21:28
这样试试看,如果还是不行,去打开 csv 源文件拷贝几行发上来:

大神厉害啊,搞定了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 17:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表