为了帮助按月对大型数据集进行分类,我尝试将条目的所有实际日期转换为月底。
我看到了类似的问题,并使用了我找到的代码,但如果日期已经是月底(这将导致下个月的月底被计算出来),它似乎就行不通了。
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是假的,而不是显示7/31/2019年,它显示1564531200000000000。
但当它是真实的,它正确地显示为7/31/2019年ActualDate。
关于下列事项的任何咨询意见:
(一)如何将数据中的所有给定日期转换到月底,即使该日期已经是月底;以及
2)当尝试使用计算列时,为什么np.where语句不能工作?
……我会非常感激的!
我找到了一个解决办法,只需将数据文件写入csv,并在创建结束之前将新的csv读取回dataframe;它似乎解决了返回1564531200000000000的np.where语句的问题。然而,我希望有一个更优雅的解决方案。
谢谢!
发布于 2019-08-15 00:13:37
在docs中提到的这种行为:
当n不是0时,如果给定的日期不在锚点上,则它会突然切换到下一个(前一个)锚点,并将\n-1额外的步骤向前或向后移动。。如果给定日期位于锚点上,则将它向前或向后移动。
你不需要np.where。解决办法很简单。如果你前进,只需减去前一天加入锚。如果你后退,在减锚前加一天。
您将进入MonthEnd,因此,在添加锚之前,只需减去一天
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发布于 2019-08-14 23:42:08
如果添加一天,只需检查日期是否仍在同一个月中,并根据结果进行偏移。
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-31https://stackoverflow.com/questions/57503071
复制相似问题