我有一个时间序列,它只包含小时、分钟和秒,当我使用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])