向pandas数据框中添加固定日期

3
我正在阅读一些数据,并使用from_records创建一个数据框,其中数据包含文本时间戳HH:MM:SS:000000。我可以使用pd.to_datetime(data.timestamp, format='%H:%M:%S:%f')将其转换为时间序列。我知道文件的日期来自文件名。有没有一种Pythonic和高效的方法来插入日期(并最终将其设置为索引)?
数据如下:
12:00:00:000000 100
12:00:01:123456 200
12:00:02:000000 300

没有插入日期,我得到了一个数据框,它看起来像这样:

(译注:该句为原文)

1900-01-01 12:00:00.000000 100
1900-01-01 12:00:01.123456 200
1900-01-01 12:00:02.000000 300

我需要的是(假设date = datetime.date(2017, 6, 28)):

2017-06-28 12:00:00.000000 100
2017-06-28 12:00:01.123456 200
2017-06-28 12:00:02.000000 300

pd.to_datetime origin 参数听起来像是我想要的,但它需要输入一个数字时间戳而不是字符串。


你应该能够只需执行 df.index += date。这种方式对我来说行得通。 - tommy.carstensen
2个回答

2

您可以通过日期使用strftime创建字符串并将其添加到time列中:

df['datetime'] = pd.to_datetime(date.strftime('%Y-%m-%d ') + df['time'],
                                format='%Y-%m-%d %H:%M:%S:%f')

print (df)
              time    A                   datetime
0  12:00:00:000000  100 2017-06-28 12:00:00.000000
1  12:00:01:123456  200 2017-06-28 12:00:01.123456
2  12:00:02:000000  300 2017-06-28 12:00:02.000000

对于索引:

df.index = pd.to_datetime(date.strftime('%Y-%m-%d ') + df['time'],
                                format='%Y-%m-%d %H:%M:%S:%f')

print (df)
                                       time    A
time                                            
2017-06-28 12:00:00.000000  12:00:00:000000  100
2017-06-28 12:00:01.123456  12:00:01:123456  200
2017-06-28 12:00:02.000000  12:00:02:000000  300

另一种解决方案:

date = datetime.date(2017, 6, 28)
days = date - datetime.date(1900, 1, 1)

df['datetime'] = pd.to_datetime(df['time'],format='%H:%M:%S:%f') + 
                 pd.to_timedelta(days, unit='d')

print (df)
              time    A                   datetime
0  12:00:00:000000  100 2017-06-28 12:00:00.000000
1  12:00:01:123456  200 2017-06-28 12:00:01.123456
2  12:00:02:000000  300 2017-06-28 12:00:02.000000

功能上来说是可以的,但有没有更快的方法,不需要将日期解析为字符串并从字符串中解析出来?(我有数千万行数据) - Kyle
另外还有什么解决方案吗? - jezrael
@jezreal 太棒了!不过,如果您在使用read_csv()和类似函数时能够指定日期偏移量,那就更好了。 - tommy.carstensen

0
这是我最终得出的结果,基于@jezrael的“另一个”答案:
df.index = pd.to_datetime(df.timestamp, format='%H:%M:%S:%f')
days = date - df.index[0].date()
df.index += pd.to_timedelta(days, unit='d')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接