如何将 pandas 数据帧日期和不同的时间格式连接到单个时间戳?
How to concatenate pandas dataframe date and different time formats to single timestamp?
我在 pandas
数据框中有两列,如下所述。注意有些 EVENT_TIME
是 hh.mm.ss
,有些是 hh:mm:ss AM/PM
格式。
当运行...
import pandas
df['EVENT_DATE'] = pd.to_datetime(df['EVENT_DATE'], format='%Y%m%d')
print(df['EVENT_DATE'])
...我可以获得消耗品(出于我的目的)格式的 EVENT_DATE
(例如 1999-07-28
)。
但是当运行...
df['EVENT_TIME'] = pd.to_datetime(df['EVENT_TIME'], format='%H.%M.%S', errors='coerce')
df['EVENT_TIME'] = pd.to_datetime(df['EVENT_TIME'], format='%I:%M:%S %p', errors='coerce')
print(df['EVENT_TIME'])
...1900-01-01
已添加到时间中,但并未应用于所有行。
1900-01-01 16:40:00
1900-01-01 15:55:00
1900-01-01 14:30:00
1900-01-01 13:26:00
NaT
NaT
NaT
NaT
如何在单个时间戳中连接日期和时间(包括多种时间格式)?
编辑 1:
@Wen-Ben 的解决方案把我带到了这里:
1 19:53:00
11 14:30:00
15 16:30:00
然后连接 EVENT_DATE 和 EVENT_TIME,我发现这个(有效):
df['TIMESTAMP'] = df.apply(lambda r : pd.datetime.combine(r['EVENT_DATE'], r['EVENT_TIME']),1)
...结果:
1 1999-07-28 19:53:00
11 2001-07-28 14:30:00
15 2002-06-07 16:30:00
下一步我想把它变成ISO8601格式。所以我发现了这个(有效):
pd.to_datetime(df['TIMESTAMP']).apply(lambda x: x.strftime('%Y%m%dT%H:%M%SZ'))
...结果:
1 19990728T19:5300Z
11 20010728T14:3000Z
15 20020607T16:3000Z
这是我的新问题:
运行 print(TIMESTAMP)
仍然显示串联版本(例如 1999-07-28 19:53:00
)而不是 ISO 版本(例如 19990728T19:5300Z
)
如何将 ISO8601 列 "added" 添加到数据框?
理想情况下,我希望它取代 TIMESTAMP
。我希望它作为数据的转换,而不是作为新列添加。
使用fillna
s1=pd.to_datetime(df['EVENT_TIME'], format='%H.%M.%S', errors='coerce')
s2=pd.to_datetime(df['EVENT_TIME'], format='%I:%M:%S %p', errors='coerce')
df['EVENT_TIME']=s1.fillna(s2)
我在 pandas
数据框中有两列,如下所述。注意有些 EVENT_TIME
是 hh.mm.ss
,有些是 hh:mm:ss AM/PM
格式。
当运行...
import pandas
df['EVENT_DATE'] = pd.to_datetime(df['EVENT_DATE'], format='%Y%m%d')
print(df['EVENT_DATE'])
...我可以获得消耗品(出于我的目的)格式的 EVENT_DATE
(例如 1999-07-28
)。
但是当运行...
df['EVENT_TIME'] = pd.to_datetime(df['EVENT_TIME'], format='%H.%M.%S', errors='coerce')
df['EVENT_TIME'] = pd.to_datetime(df['EVENT_TIME'], format='%I:%M:%S %p', errors='coerce')
print(df['EVENT_TIME'])
...1900-01-01
已添加到时间中,但并未应用于所有行。
1900-01-01 16:40:00
1900-01-01 15:55:00
1900-01-01 14:30:00
1900-01-01 13:26:00
NaT
NaT
NaT
NaT
如何在单个时间戳中连接日期和时间(包括多种时间格式)?
编辑 1:
@Wen-Ben 的解决方案把我带到了这里:
1 19:53:00
11 14:30:00
15 16:30:00
然后连接 EVENT_DATE 和 EVENT_TIME,我发现这个(有效):
df['TIMESTAMP'] = df.apply(lambda r : pd.datetime.combine(r['EVENT_DATE'], r['EVENT_TIME']),1)
...结果:
1 1999-07-28 19:53:00
11 2001-07-28 14:30:00
15 2002-06-07 16:30:00
下一步我想把它变成ISO8601格式。所以我发现了这个(有效):
pd.to_datetime(df['TIMESTAMP']).apply(lambda x: x.strftime('%Y%m%dT%H:%M%SZ'))
...结果:
1 19990728T19:5300Z
11 20010728T14:3000Z
15 20020607T16:3000Z
这是我的新问题:
运行 print(TIMESTAMP)
仍然显示串联版本(例如 1999-07-28 19:53:00
)而不是 ISO 版本(例如 19990728T19:5300Z
)
如何将 ISO8601 列 "added" 添加到数据框?
理想情况下,我希望它取代 TIMESTAMP
。我希望它作为数据的转换,而不是作为新列添加。
使用fillna
s1=pd.to_datetime(df['EVENT_TIME'], format='%H.%M.%S', errors='coerce')
s2=pd.to_datetime(df['EVENT_TIME'], format='%I:%M:%S %p', errors='coerce')
df['EVENT_TIME']=s1.fillna(s2)