转换为日期时间,但如何在python中删除'1900-01-01'



我有一个时间序列,它只包含小时、分钟和秒,当我使用datetime将其转换为datetime类型时,它会自动添加"1900-01-01"作为日期。如何取消日期?我想获得一个日期时间类型的数据,以便进一步绘制matplotlib。

我的代码是

df['Time(H:M:S)']=pd.to_datetime(df['Time(H:M:S)'], format='%H:%M:%S')

如果您想使用matplotlib绘制时间序列图,这里有一些选项:

(1( 使用df[col].dt.time仅提取时间分量,结果列为字符串对象

import pandas as pd
df = pd.DataFrame({'Time(H:M:S)': ['11:02:03', '11:22:33', '12:00:01']})
df['Time(H:M:S)'] = pd.to_datetime(df['Time(H:M:S)'].astype(str)).dt.time
print(df)
Time(H:M:S)
0    11:02:03
1    11:22:33
2    12:00:01

(2( 添加今天的日期作为前缀并转换为日期时间对象

df['Time(H:M:S)2'] = pd.to_datetime('2022-08-22 ' + df['Time(H:M:S)'].astype(str))
print(df)
Time(H:M:S)        Time(H:M:S)2
0    11:02:03 2022-08-22 11:02:03
1    11:22:33 2022-08-22 11:22:33
2    12:00:01 2022-08-22 12:00:01

(3( 转换为timedelta对象,得到的列是前缀为"的timedelta;0天";

df['Time(H:M:S)3'] = pd.to_timedelta(df['Time(H:M:S)'].astype(str))
print(df)
Time(H:M:S)        Time(H:M:S)2    Time(H:M:S)3
0    11:02:03 2022-08-22 11:02:03 0 days 11:02:03
1    11:22:33 2022-08-22 11:22:33 0 days 11:22:33
2    12:00:01 2022-08-22 12:00:01 0 days 12:00:01

(4( 将datetime转换为Epoch时间戳,得到的列是int对象

df['Time(H:M:S)4'] = pd.to_datetime(df['Time(H:M:S)'].astype(str)).astype('int64') // int(1e9)
print(df)
Time(H:M:S) Time(H:M:S)1        Time(H:M:S)2    Time(H:M:S)3  Time(H:M:S)4
0    11:02:03     11:02:03 2022-08-22 11:02:03 0 days 11:02:03    1661166123
1    11:22:33     11:22:33 2022-08-22 11:22:33 0 days 11:22:33    1661167353
2    12:00:01     12:00:01 2022-08-22 12:00:01 0 days 12:00:01    1661169601

列类型为

print(df.info())
#   Column        Non-Null Count  Dtype          
---  ------        --------------  -----          
0   Time(H:M:S)   3 non-null      object         
1   Time(H:M:S)2  3 non-null      datetime64[ns] 
2   Time(H:M:S)3  3 non-null      timedelta64[ns]
3   Time(H:M:S)4  3 non-null      int64

您可以使用timedelta来测量时间增量,而不是使用引用特定时刻(并且必须附加日期(的datetime。

In [2]: df = pd.DataFrame({
...:     'Time(H:M:S)': [
...:         '0:01:00',
...:         '0:01:01',
...:         '1:00:00',
...:         '5:24:04',
...:         '26:14:23',
...:     ],
...: })
In [3]: df['Time(H:M:S)'] = pd.to_timedelta(df['Time(H:M:S)'])
In [4]: df
Out[4]:
Time(H:M:S)
0 0 days 00:01:00
1 0 days 00:01:01
2 0 days 01:00:00
3 0 days 05:24:04
4 1 days 02:14:23

有关更多信息,请参阅时间增量上的pandas文档。

正如@jens所说,日期时间总是有日期部分。

但是,如果您想删除日期,可以添加.astype(str)以确保对象为字符串格式,并应用.apply(lambda),如下所示:

df['Time(H:M:S)'] = df['Time(H:M:S)'].astype(str).apply(lambda x: x.split(' ')[-1])

最新更新