我的数据框是这个
In[1]: df1
Out[1]
Loan Date Negotiation
2019-03-31
2019-03-31
2019-03-31
as Loan Date Negotiation datetime64[ns]
所以我想使函数减去2天。如果该月的最后一天是星期日,我将从中减去2天。
根据上面的数据框,2019年3月31日是星期日
我已经尝试过,但是失败了,这是
def subtractingDate(dateTime):
dateTimestamp = pd.Timestamp(dateTime)
newDate = dateTimestamp - pd.Timedelta("2 days")
return newDate
dfMARET.loc[dfMARET["Loan Date Negotiation"].dt.dayofweek == 6, "New Date"] = subtractingDate(dfMARET["Loan Date Negotiation"])
*note: 6 is for sunday
So the error is
TypeError Traceback (most recent call last)
<ipython-input-9-cc2a3348e6ce> in <module>
16 # a = subtractingDate(dfMARET["Loan Date Negotiation"])
17 # a
---> 18 dfMARET.loc[dfMARET["Loan Date Negotiation"].dt.dayofweek == 6, "New Date"] = subtractingDate(dfMARET["Loan Date Negotiation"])
19 dfMARET
20
<ipython-input-9-cc2a3348e6ce> in subtractingDate(dateTime)
10
11 def subtractingDate(dateTime):
---> 12 dateTimestamp = pd.Timestamp(dateTime)
13 newDate = dateTimestamp - pd.Timedelta(days = 2)
14 return newDate
pandas\_libs\tslibs\timestamps.pyx in pandas._libs.tslibs.timestamps.Timestamp.__new__()
pandas\_libs\tslibs\conversion.pyx in pandas._libs.tslibs.conversion.convert_to_tsobject()```
所以我的期望是
Loan Date Negotiation
2019-03-29
2019-03-29
2019-03-29
大熊猫的解决方案?
谢谢
答案 0 :(得分:0)
如果需要先将datetime64转换为Timestamp,则可以使用:
ports:
- 9050:7050
并使用df['Date'] = [pd.Timestamp(x) for x in df['Date']]
:
timedelta()
或者在整个列from datetime import datetime, timedelta
dt = pd.Timestamp(2019,3,31)
new_dt = dt-timedelta(days=2)
new_dt
> datetime.datetime(2019, 3, 29, 0, 0)
new_dt.strftime('%Y-%m-%d')
> '2019-03-29'
上显示:
Date
编辑:完整示例:
df['New_Date'] = df['Date']-timedelta(days=2)
import numpy as np
from datetime import datetime, timedelta
df1 = pd.DataFrame([[np.datetime64(datetime(2019, 3, 31))],
[np.datetime64(datetime(2019, 3, 27))],
[np.datetime64(datetime(2019, 3, 24))]],
columns=['Loan Date Negotiation'])
df1
df1['Loan Date Negotiation'].dtype
> dtype('<M8[ns]')
是M8[ns]
的特定类型,因此在进一步处理中应该没有区别。
如果只想在星期天减去两天,则可以使用datetime64[ns]
:
np.where()
索引0和2的日期为星期日,并减去2天。未触及索引1的日期。
在每个单独的时间戳记上通过列表理解的替代方式
df1['New_Date'] = np.where(df1['Loan Date Negotiation'].dt.dayofweek==6,
df1['Loan Date Negotiation']-timedelta(days=2),
df1['Loan Date Negotiation'])
答案 1 :(得分:0)
您接近了!您只需要更改传递给Timedelta()
的内容即可。
这是一个例子:
import pandas as pd
ts = pd.Timestamp(2017, 1, 1, 12)
days = pd.Timedelta(days=2)
print(days)
print(ts)
print(ts - days)
输出:
2 days 00:00:00
2017-01-01 12:00:00
2016-12-30 12:00:00