python熊猫:如何在日期框上循环并添加列

python熊猫:如何在日期框上循环并添加列,python,pandas,Python,Pandas,我需要一个循环来完成这段代码正在做的事情,并自动生成列ep1 ep2等等 df['ep1'] = df.ep1.apply(lambda x: datetime.datetime(x.year,x.month,1)) df['ep2'] = df.ep1.apply(lambda x: datetime.datetime((x+datetime.timedelta(days=40)).year,(x+datetime.timedelta(days=40)).month,1)) df['ep3']

我需要一个循环来完成这段代码正在做的事情,并自动生成列ep1 ep2等等

df['ep1'] = df.ep1.apply(lambda x: datetime.datetime(x.year,x.month,1))
df['ep2'] = df.ep1.apply(lambda x: datetime.datetime((x+datetime.timedelta(days=40)).year,(x+datetime.timedelta(days=40)).month,1))
df['ep3'] = df.ep2.apply(lambda x: datetime.datetime((x+datetime.timedelta(days=40)).year,(x+datetime.timedelta(days=40)).month,1))
其中ep向量是df.opdate和df.closdate之间的月份的第一天

首先

import pandas as pd
import datetime
d = {'closdate' : pd.Series([datetime.datetime(2014, 3, 2), datetime.datetime(2014, 2, 2)]),'opdate' : pd.Series([datetime.datetime(2014, 1, 1), datetime.datetime(2014, 1, 1)])}

df=pd.DataFrame(d)

df['ep1'] = df.opdate.apply(lambda x: x if x > datetime.datetime(2014,1,1) else datetime.datetime(2014,1,1))
df['ep1'] = df.ep1.apply(lambda x: datetime.datetime(x.year,x.month,1))
df['ep2'] = df.ep1.apply(lambda x: datetime.datetime((x+datetime.timedelta(days=40)).year,(x+datetime.timedelta(days=40)).month,1))
df['ep3'] = df.ep2.apply(lambda x: datetime.datetime((x+datetime.timedelta(days=40)).year,(x+datetime.timedelta(days=40)).month,1))

如何循环直到ep大于df.closdate?

使用
where
而不是
apply
,并使用
np.timedelta64添加天数

import numpy as np
from pandas import Timestamp

months = range(1, 13)
df['ep0'] = df.opdate.where(df.opdate > Timestamp('20140101'), Timestamp('20140101'))
for month in months:
    colname = 'ep%d' % month
    prev_colname = 'ep%d' % (month - 1)
    df[colname] = df[prev_colname] + np.timedelta64(40, 'D')

使用
where
而不是
apply
,并使用
np.timedelta64

import numpy as np
from pandas import Timestamp

months = range(1, 13)
df['ep0'] = df.opdate.where(df.opdate > Timestamp('20140101'), Timestamp('20140101'))
for month in months:
    colname = 'ep%d' % month
    prev_colname = 'ep%d' % (month - 1)
    df[colname] = df[prev_colname] + np.timedelta64(40, 'D')

为什么要重复相同的操作来创建
df['ep1']
,为什么要创建
ep1
ep2
相等的列?您的目标是创建日期为
上一列的日期+1个月的列吗?我需要它提前一个月。ep2应该比ep1早一个月(但仍然是该月的第一天),只要它符合该行的op和close值,实际数据集将扩展30到未知的月份,我需要创建列的内容,例如“ep%s”%counter,我不知道在哪里寻求帮助。为什么你要重复同样的操作来创建
df['ep1']
,为什么你要创建
ep1
ep2
相等的列?你的目标是创建日期为
前一列的日期+1个月的列吗?我需要它提前一个月。ep2应该比ep1早一个月(但仍然是该月的第一天),只要它符合该行的op和close值,实际数据集将扩展30到未知的月份,我需要一些创建列的东西,例如“ep%s”%counter,我不知道在哪里寻求帮助。哇。太好了。我需要学习这个!有没有一种简单的方法可以将新列重置为第一天?您可以访问
df.index
等属性,并手动重置它,类似于上面所做的操作。哇。太好了。我需要学习这个!有没有一种简单的方法可以将新列重置为第一天?您可以访问
df.index
等属性,并手动重置它,类似于上面所做的操作。