将日期时间字符串转换为 pandas 数据框中日、月、年的新列
Convert datetime string to new columns of Day, Month, Year in pandas data frame
我有一个包含 3 列的数据框:time
(格式为 'YYYY-MM-DDTHH:MM:SSZ')、device_id
和 rain
,但我需要第一个列 time
变为 day
、month
和 year
的三列,其值来自时间戳。
所以原始数据框看起来像这样:
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
但我试图让数据框看起来像这样:
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
我不关心 hour/seconds/minutes 但需要原始时间戳中的这些值,我什至不知道从哪里开始。请帮忙!
下面是一些可重现的入门代码:
>> 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
只需将时间拆分为-
或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)
接近@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)
最干净的方法是使用内置 pandas 日期时间函数。
首先,将列转换为日期时间:
df["time"] = pd.to_datetime(df["time"])
然后,提取您的信息:
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)
我有一个包含 3 列的数据框:time
(格式为 'YYYY-MM-DDTHH:MM:SSZ')、device_id
和 rain
,但我需要第一个列 time
变为 day
、month
和 year
的三列,其值来自时间戳。
所以原始数据框看起来像这样:
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
但我试图让数据框看起来像这样:
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
我不关心 hour/seconds/minutes 但需要原始时间戳中的这些值,我什至不知道从哪里开始。请帮忙!
下面是一些可重现的入门代码:
>> 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
只需将时间拆分为-
或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)
接近@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)
最干净的方法是使用内置 pandas 日期时间函数。
首先,将列转换为日期时间:
df["time"] = pd.to_datetime(df["time"])
然后,提取您的信息:
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)