【问题标题】:Changing the date in a datetime column in pandas DataFrame更改 pandas DataFrame 中日期时间列中的日期
【发布时间】:2017-11-04 02:29:59
【问题描述】:

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

为了在 pandas 中创建一个日期时间列,我做了以下操作(“日期”和“时间”都是字符串):

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

但是,datetime 要求时间的小时数介于 0 到 23 之间。我可以将 '24:00:00' 替换为 '00:00:00' 为:

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

但这实际上是那天的早晨,而不是晚上。理想情况下,我会在日期上加一天,除非我不知道该怎么做。 我想说“在哪里 '时间' == '00:00:00' 在日期上加一天”。我尝试过这样的事情:

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

但这不起作用(而且看起来很可怕)。

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

谢谢!

【问题讨论】:

  • 也许检查this 发布
  • 似乎我必须在循环中执行此操作,然后再将其放入 pandas 列。当然可行,只是似乎还有另一种更简单的方法。
  • 你可以将它作为一个函数应用,只应用于 >= 24 的值。应该不会是低效的

标签: python pandas datetime


【解决方案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'))

【讨论】:

  • 这似乎不起作用 - eutils.parsdate(d_time) 在传递 d_time 字符串时返回 None 。日期时间字符串的格式为“2015-01-01 01:00:00”,而 parsedate 似乎无法理解?
  • 啊,我以为它的格式是“2015 年 1 月 1 日”。查看我的编辑。
【解决方案2】:

我已经想出了一种方法来完成这项工作,尽管我不确定它是最优雅的。它基于 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多