首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在熊猫数据栏中找到一个月的月底

在熊猫数据栏中找到一个月的月底
EN

Stack Overflow用户
提问于 2019-08-14 23:04:06
回答 2查看 314关注 0票数 0

为了帮助按月对大型数据集进行分类,我尝试将条目的所有实际日期转换为月底。

我看到了类似的问题,并使用了我找到的代码,但如果日期已经是月底(这将导致下个月的月底被计算出来),它似乎就行不通了。

代码语言:javascript
复制
df['CalcEnd'] = pd.to_datetime(df['ActualDate'], format="%m/%d/%Y") + MonthEnd(1)

这导致:

代码语言:javascript
复制
    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就会产生一系列奇怪的数字。

具体来说,我试过:

代码语言:javascript
复制
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是假的,而不是显示7/31/2019年,它显示1564531200000000000。

但当它是真实的,它正确地显示为7/31/2019年ActualDate。

关于下列事项的任何咨询意见:

(一)如何将数据中的所有给定日期转换到月底,即使该日期已经是月底;以及

2)当尝试使用计算列时,为什么np.where语句不能工作?

……我会非常感激的!

我找到了一个解决办法,只需将数据文件写入csv,并在创建结束之前将新的csv读取回dataframe;它似乎解决了返回1564531200000000000的np.where语句的问题。然而,我希望有一个更优雅的解决方案。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-15 00:13:37

在docs中提到的这种行为:

当n不是0时,如果给定的日期不在锚点上,则它会突然切换到下一个(前一个)锚点,并将\n-1额外的步骤向前或向后移动。。如果给定日期位于锚点上,则将它向前或向后移动。

你不需要np.where。解决办法很简单。如果你前进,只需减去前一天加入锚。如果你后退,在减锚前加一天。

您将进入MonthEnd,因此,在添加锚之前,只需减去一天

代码语言:javascript
复制
df['CalcEnd'] = df['ActualDate']  - pd.offsets.Day() + pd.offsets.MonthEnd(1)

Out[370]:
  ActualDate    CalcEnd
0 2019-07-01 2019-07-31
1 2019-07-02 2019-07-31
2 2019-07-31 2019-07-31
票数 2
EN

Stack Overflow用户

发布于 2019-08-14 23:42:08

如果添加一天,只需检查日期是否仍在同一个月中,并根据结果进行偏移。

代码语言:javascript
复制
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)

结果

代码语言:javascript
复制
    ActualDate  CalcEnd
0   2019-07-01  2019-07-31
1   2019-07-02  2019-07-31
2   2019-07-31  2019-07-31
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57503071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档