python-3.x - 在 pandas 数据框列中查找月末
问题描述
为了帮助按月对大型数据集进行分类,我尝试将条目的所有实际日期转换为月末。
我看到了与此类似的问题并使用了我找到的代码,但如果日期恰好已经是月底(这将导致计算下个月的月底),它似乎不起作用。
df['CalcEnd'] = pd.to_datetime(df['ActualDate'], format="%m/%d/%Y") + MonthEnd(1)
这导致:
ActualDate CalcEnd
7/1/2019 7/31/2019
7/2/2019 7/31/2019
7/31/2019 8/31/2019
第三个条目应返回 2019 年 7 月 31 日。
我尝试使用 numpy 仅在日期尚未到月底时才使用 CalcEnd 以避免此问题,但由于某种原因,如果还不是月底,则 CalcEnd 会导致一系列奇怪的数字。
具体来说,我试过:
def isMonthEnd(date):
return date + pd.offsets.MonthEnd(0) == date
df['EndCheck'] = isMonthEnd(pd.to_datetime(df['ActualDate'], format="%m/%d/%Y"))
df['CalcEnd'] = pd.to_datetime(df['ActualDate'], format="%m/%d/%Y") + MonthEnd(1)
df['End'] = np.where(df['EndCheck']==False, df['CalcEnd'], df['ActualDate'])
当 EndCheck 为 False 时,它不会显示 2019 年 7 月 31 日,而是显示 1564531200000000000。
但当它为 True 时,它正确地将 ActualDate 显示为 7/31/2019。
任何建议:
1)如何将数据框中的所有给定日期转换为月末,即使给定日期已经是月末;和
2) 为什么在尝试使用计算列时 np.where 语句不起作用
....将不胜感激!
我可以通过将数据帧写入 csv 并在创建 End 之前将新的 csv 读回数据帧来找到解决方法;它似乎解决了 np.where 语句返回 1564531200000000000 的问题。但是,我希望有一个更优雅的解决方案。
谢谢!
解决方案
如果添加一天并根据结果进行偏移,只需检查日期是否仍在同一月份
def to_end_of_month(date):
if (date + pd.offsets.Day(1)).month == date.month:
return date + pd.offsets.MonthEnd(1)
else:
return date + pd.offsets.MonthEnd(0)
df['CalcEnd'] = df['ActualDate'].apply(to_end_of_month)
结果
ActualDate CalcEnd
0 2019-07-01 2019-07-31
1 2019-07-02 2019-07-31
2 2019-07-31 2019-07-31
推荐阅读
- c++ - 协程中的默认引用参数和生命周期
- python - 如何在函数中将用户输入作为参数传递?
- python - Python:在不重建 EmailMessage 的情况下单独向多个收件人发送电子邮件
- r - 从 XML 中提取单个节点,在 R 中添加父节点并另存为 XML
- html - CSS包装器内容的全高而不是窗口的全高
- bison - 野牛难悬垂的其他去除
- angular - ng alain 将 2 个自定义小部件并排放置
- vue.js - vue-i18n 抛出错误“无法读取未定义的属性(读取'hasOwnProperty')”
- java - 使用 Gradle 构建 .jar,在线程“main”java.lang.NoClassDefFoundError 中执行 .jar local throws Exception
- reactjs - React无法解构'this.props.match'的属性'params',因为它是未定义的