Pandas 数据帧 - 如何为仅包含日期而不包含时间的现有日期列合成添加唯一时间戳?



我有一个简单的数据帧,带有字符串索引。
该字符串表示时间(例如 2018-01-01(,并包含重复项。
应用 pd.to_datetime(( 使我朝着正确的方向前进,并将索引从字符串类型很好地转换为日期时间类型。
但是,它不能解决重复问题。
理想情况下,我希望为每个索引单元格综合添加一些唯一的时间戳 (%h:%m:%s(。
你能指导我如何实现这一目标吗?

以下是我想要实现的目标的简单示例:

import pandas as pd
df = pd.DataFrame(index = ['2018-01-01', '2018-01-01', '2018-01-01'], 
columns = ['A', 'B', 'C'] ).fillna(0)

这将生成以下数据帧:

A  B  C
2018-01-01  0  0  0
2018-01-01  0  0  0
2018-01-01  0  0  0

我想将其转换为类似的东西(唯一的日期时间索引(:

A  B  C
2018-01-01 00:00:01  0  0  0
2018-01-01 00:00:02  0  0  0
2018-01-01 00:00:03  0  0  0

谢谢前方,
沙哈尔

如果日期时间的所有值都是唯一的,则使用to_datetimeunit一起使用,如果按索引的第一个值origin参数,并通过DataFrame.set_index添加到索引中:

df = df.set_index(pd.to_datetime(np.arange(len(df)), 
unit='s', 
origin=df.index[0]))
print (df)
A  B  C
2018-01-01 00:00:00  0  0  0
2018-01-01 00:00:01  0  0  0
2018-01-01 00:00:02  0  0  0

如果索引中有多个唯一datetime,请将GroupBy.cumcount创建的时间增量添加到Datetimeindex

import pandas as pd
df = pd.DataFrame(index = ['2018-01-01', '2018-01-01', '2018-01-01',
'2018-02-01', '2018-02-01'], 
columns = ['A', 'B', 'C'] ).fillna(0)

df = df.set_index(pd.to_datetime(df.index) + 
pd.to_timedelta(df.groupby(level=0).cumcount(), unit='s'))
print (df)
A  B  C
2018-01-01 00:00:00  0  0  0
2018-01-01 00:00:01  0  0  0
2018-01-01 00:00:02  0  0  0
2018-02-01 00:00:00  0  0  0
2018-02-01 00:00:01  0  0  0

您可以将pd.to_datetimepd.to_timedelta结合使用以获得所需的结果。

用:

df.index = (
pd.to_datetime(df.index) + 
pd.to_timedelta(range(1, len(df) + 1), unit='s'))
print(df)

这会将生成的数据帧打印为:

A  B  C
2018-01-01 00:00:01  0  0  0
2018-01-01 00:00:02  0  0  0
2018-01-01 00:00:03  0  0  0

要更笼统地表达您的任务(针对多个日期(:

  • 您有一个带有字符串索引的数据帧,其格式类似于日期,
  • 要将索引转换为日期时间
  • 但在每个日期内将时间部分设置为奉献秒。

为此,您可以运行:

df.index = pd.Series(pd.Timedelta('1S'), index=pd.to_datetime(df.index)).groupby(level=0)
.transform(lambda grp: grp.cumsum() + grp.index)

步骤:

  • pd.Series(pd.Timedelta('1S'), index=pd.to_datetime(df.index))- 创建 一个系列,填充了一秒的值,并且df中的索引转换为日期时间,目前仍然没有时间部分。
  • groupby(...)- 按日期分组。
  • transform(...)- 使用给定的 lambda 函数对其进行转换。
  • grp.cumsum()- 时间部分 - 连续秒。
  • + grp.index- 添加日期部分。
  • df.index- 将df中的索引设置为此结果。

结果,对于 2 个日期,即使日期"混合",仍然可以:

A  B  C
2018-01-01  0  0  0
2018-01-01  0  0  0
2018-01-01  0  0  0
2018-01-02  0  0  0
2018-01-02  0  0  0
2018-01-02  0  0  0
2018-01-01  0  0  0

如果数据帧具有单个日期,则仍可使用此代码 (您将只有一个组(。

最新更新