根据pandas中的列名快速使用datetime填充单元格?

根据pandas中的列名快速使用datetime填充单元格?,pandas,datetime,Pandas,Datetime,我需要将繁琐的列标题转换为该列中每个单元格的日期时间。例如,我需要列标题20011006_6_布拉布拉布拉布拉中的日期时间“2001-10-06 6:00”。我有一列其他日期时间,我最终会用它来做一些计算 示例df的构造: date_rng0=pd.date_range(start=datetime.date(2001,10,1),end=datetime.date(2001,10,7),freq='D') date_rng1=pd.date_range(start=datetime.date(

我需要将繁琐的列标题转换为该列中每个单元格的日期时间。例如,我需要列标题20011006_6_布拉布拉布拉布拉中的日期时间“2001-10-06 6:00”。我有一列其他日期时间,我最终会用它来做一些计算

示例df的构造:

date_rng0=pd.date_range(start=datetime.date(2001,10,1),end=datetime.date(2001,10,7),freq='D')
date_rng1=pd.date_range(start=datetime.date(2001,10,5),end=datetime.date(2001,10,8),freq='D')
drstr0=[str(i.year)+str(i.month)+str(i.day)+'_blah' for i in date_rng0]
drstr1=[str(i.year)+str(i.month)+str(i.day)+'_blah' for i in date_rng1]
#make zero df
arr=np.zeros((len(date_rng0),len(date_rng1))) # all ones, mask out below
df=pd.DataFrame(arr,index=drstr0,columns=drstr1)
首先,我将所有列名逐列复制到单元格中。我的数据处理速度非常慢:

for c in df.columns:
    df[c]=c
然后我使用一个看起来很糟糕的lambda mass将它们转换为datetime:

for c in df.columns:
    df.loc[:,c]=df.loc[:,c].apply(lambda x: datetime.date(int(x.split('_')[0][:4]),int(x.split('_')[0][4:6]),int(x.split('_')[0][6:])))
然后,我使用类似的lambda函数创建一个datetime列:

df['date_time']=df.index
df['date_time']=df.loc[:,'date_time'].apply(lambda x: datetime.date(int(x.split('_')[0][:4]),int(x.split('_')[0][4:6]),int(x.split('_')[0][6:])))

df.head()
给出:

    2001105_blah    2001106_blah    2001107_blah    2001108_blah    date_time
2001101_blah    2001-10-05  2001-10-06  2001-10-07  2001-10-08  2001-10-01
2001102_blah    2001-10-05  2001-10-06  2001-10-07  2001-10-08  2001-10-02
2001103_blah    2001-10-05  2001-10-06  2001-10-07  2001-10-08  2001-10-03
2001104_blah    2001-10-05  2001-10-06  2001-10-07  2001-10-08  2001-10-04
2001105_blah    2001-10-05  2001-10-06  2001-10-07  2001-10-08  2001-10-05
然后我可以做一点数学:

ndf=df.copy()
for c in df.columns:
    ndf.loc[:,c]=df.loc[:,c]-df.loc[:,'date_time']
这就是我最终想要的:

    2001105_blah    2001106_blah    2001107_blah    2001108_blah    date_time
2001101_blah    4 days  5 days  6 days  7 days  0 days
2001102_blah    3 days  4 days  5 days  6 days  0 days
2001103_blah    2 days  3 days  4 days  5 days  0 days
2001104_blah    1 days  2 days  3 days  4 days  0 days
2001105_blah    0 days  1 days  2 days  3 days  0 days

问题是,尽管离开了30分钟,但使用我的2000 x 30000数据帧,这个过程从未完成。我觉得我做错了什么。有任何提高效率的建议吗?

您可以尝试使用
str.split
'.join
,和
pd.to\u datetime

#add new column with values as the column names joined into a string
df['temp']=(' '.join(df.columns.astype(str)))

#expand the dataframe
temp=df['temp'].str.split(expand=True)

#rename the columns with original names
temp.columns=df.columns[:-1]

#parse the index to datetime
index=pd.to_datetime(df.index.str.split('_').str[0],format='%Y%m%d').to_numpy()

#substract the index to each column
newdf=temp.apply(lambda x: pd.to_datetime(x.str.split('_').str[0],format='%Y%m%d')-index)

#mask only the rows where all values are non-negative
newdf=newdf[newdf.apply(lambda x: x >= pd.Timedelta(0)).all(1)]
输出:

print(newdf)

             2001105_blah 2001106_blah 2001107_blah 2001108_blah
2001101_blah       4 days       5 days       6 days       7 days
2001102_blah       3 days       4 days       5 days       6 days
2001103_blah       2 days       3 days       4 days       5 days
2001104_blah       1 days       2 days       3 days       4 days
2001105_blah       0 days       1 days       2 days       3 days

回答得好,速度快得多。谢谢