大Pandas日期时间的减法

2024-09-30 20:34:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框,这是什么

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-03-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

熊猫有什么解决办法?你知道吗

谢谢


Tags: 数据inpandasdatetimedatetimestamplibspd
2条回答

你很接近!您只需要将传递的内容更改为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

如果需要先将datetime64转换为Timestamp,可以使用:

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

enter image description here

df1['Loan Date Negotiation'].dtype
> dtype('<M8[ns]')

M8[ns]datetime64[ns]的一种特殊类型,因此在进一步处理中应该没有区别。你知道吗

如果您只想在星期天减去两天,您可以使用np.where()

df1['New_Date'] = np.where(df1['Loan Date Negotiation'].dt.dayofweek==6, 
         df1['Loan Date Negotiation']-timedelta(days=2), 
         df1['Loan Date Negotiation'])

enter image description here

索引0和索引2的日期是星期天,减去2天。未触及索引1处的日期。你知道吗

通过对每个时间戳的列表理解选择

df1['New_Date'] = [x-timedelta(days=2) if x.weekday()==6 else x for x in df1['Loan Date Negotiation']]

相关问题 更多 >