我将一个时间序列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)
但那不起作用(而且看起来很糟糕)。
我有什么想法可以让它发挥作用吗?
谢谢!
答案 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)