将日期时间字符串转换为 Pandas 数据框中的日、月、年的新列

JAG*_*024 4 python datetime multiple-columns dataframe pandas

我是 python 新手,有一个非常简单(希望很简单!)的问题。

假设我有一个包含 3 列的数据框:时间(格式为 YYYY-MM-DDTHH:MM:SSZ)、device_id 和rain,但我需要第一列“时间”成为“的三列”日”、“月”和“年”以及时间戳中的值。

所以原始数据框看起来像这样:

     time                  device_id                              rain
     2016-12-27T00:00:00Z  9b839362-b06d-4217-96f5-f261c1ada8d6   NaN
     2016-12-28T00:00:00Z  9b839362-b06d-4217-96f5-f261c1ada8d6   0.2
     2016-12-29T00:00:00Z  9b839362-b06d-4217-96f5-f261c1ada8d6   NaN
     2016-12-30T00:00:00Z  9b839362-b06d-4217-96f5-f261c1ada8d6   NaN
     2016-12-31T00:00:00Z  9b839362-b06d-4217-96f5-f261c1ada8d6   NaN
Run Code Online (Sandbox Code Playgroud)

但我试图让数据框看起来像这样:

     day  month  year  device_id                              rain
     27   12     2016  9b839362-b06d-4217-96f5-f261c1ada8d6   NaN
     28   12     2016  9b839362-b06d-4217-96f5-f261c1ada8d6   0.2
     29   12     2016  9b839362-b06d-4217-96f5-f261c1ada8d6   NaN
     30   12     2016  9b839362-b06d-4217-96f5-f261c1ada8d6   NaN
     31   12     2016  9b839362-b06d-4217-96f5-f261c1ada8d6   NaN
Run Code Online (Sandbox Code Playgroud)

我不关心小时/秒/分钟,但需要原始时间戳中的这些值,我什至不知道从哪里开始。请帮忙!

以下是一些可重现的代码以开始使用:

>> import pandas as pd 
>> df = pd.DataFrame([['2016-12-27T00:00:00Z', '9b839362-b06d-4217-96f5-f261c1ada8d6', 'NaN']], columns=['time', 'device_id', 'rain'])
>> print df
2016-12-27T00:00:00Z  9b849362-b06d-4217-96f5-f261c1ada8d6  NaN
Run Code Online (Sandbox Code Playgroud)

nla*_*aux 5

最干净的方法是使用内置的熊猫日期时间函数。

首先,将列转换为日期时间:

df["time"] = pd.to_datetime(df["time"])
Run Code Online (Sandbox Code Playgroud)

然后,提取您的信息:

df["day"] = df['time'].map(lambda x: x.day)
df["month"] = df['time'].map(lambda x: x.month)
df["year"] = df['time'].map(lambda x: x.year)
Run Code Online (Sandbox Code Playgroud)


Psi*_*dom 3

-只需用or分割时间T,前三个元素应对应于年、月和日列,将其与其他两列连接即可得到您需要的内容:

pd.concat([df.drop('time', axis = 1), 
          (df.time.str.split("-|T").str[:3].apply(pd.Series)
          .rename(columns={0:'year', 1:'month', 2:'day'}))], axis = 1)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


接近 @nlassaux 方法的另一种方法是:

df['time'] = pd.to_datetime(df['time'])   
df['year'] = df.time.dt.year
df['month'] = df.time.dt.month
df['day'] = df.time.dt.day
df.drop('time', axis=1, inplace=True)
Run Code Online (Sandbox Code Playgroud)