在pandas DataFrame中更改datetime列中的日期

时间:2017-11-03 17:10:02

标签: python pandas datetime

我将一个时间序列csv文件导入到pandas DataFrame中,但是文件中的时间有一个怪癖。午夜设置为' 00:00:00',而不是' 00:00' (这是pythons datetime喜欢它的方式)。

要在pandas中创建日期时间列,我已完成以下操作('日期'时间'时间'是字符串):

df['Date and Time'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])

但是,日期时间要求小时数在0到23之间。我可以替换24:00:00'到' 00:00'用:

df['Time'].replace('24:00:00', '00:00:00', inplace = True)

但事实上,那天早上,而不是夜晚。理想情况下,我会在日期中添加一天,除非我不知道如何做到这一点。 我想说" Where' Time' ==' 00:00:00'在日期添加一天"。我尝试过这样的事情:

df['Date and Time'][df['Time'] == '00:00:00'] = df['Date and Time'[df['Time'] == '00:00:00'] + timedelta(days = 1)

但那不起作用(而且看起来很糟糕)。

我有什么想法可以让它发挥作用吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

来自this answer

import email.utils as eutils
import time
import datetime
def fix_datetime(d_time):
    ntuple=eutils.parsedate(d_time)
    timestamp=time.mktime(ntuple)
    return datetime.datetime.fromtimestamp(timestamp)

df['Date and Time'] = (df['Date'] + ' ' + df['Time']).apply(fix_datetime)

结果列'日期和时间'属于datetime64类型。

如果日期的格式为' YYYY-MM-DD',我们首先将其转换为RFC 2822标准,如下所示:

df['Date'] = df['Date'].apply(lambda date: datetime.datetime.strptime(date, '%Y-%m-%d').strftime('%d %b %Y'))

答案 1 :(得分:0)

我已经找到了一种方法来完成这项工作,虽然我不确定它是最优雅的。基于Sebastians的那种回答非常感谢!

def add_day(timestamp):
  if timestamp.hour == 0:
    timestamp = timestamp + timedelta(days = 1 )
  return timestamp

df['Date and Time'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])
df['Date and Time']  = df['Date and Time'].apply(add_day)