【问题标题】:Combine Date and Time columns using python pandas使用 python pandas 组合日期和时间列
【发布时间】:2013-08-01 10:24:37
【问题描述】:

我有一个包含以下列的 pandas 数据框:

data = {'Date': ['01-06-2013', '02-06-2013', '02-06-2013', '02-06-2013', '02-06-2013', '03-06-2013', '03-06-2013', '03-06-2013', '03-06-2013', '04-06-2013'],
        'Time': ['23:00:00', '01:00:00', '21:00:00', '22:00:00', '23:00:00', '01:00:00', '21:00:00', '22:00:00', '23:00:00', '01:00:00']}
df = pd.DataFrame(data)

         Date      Time
0  01-06-2013  23:00:00
1  02-06-2013  01:00:00
2  02-06-2013  21:00:00
3  02-06-2013  22:00:00
4  02-06-2013  23:00:00
5  03-06-2013  01:00:00
6  03-06-2013  21:00:00
7  03-06-2013  22:00:00
8  03-06-2013  23:00:00
9  04-06-2013  01:00:00

如何结合 data['Date'] & data['Time'] 来获得以下信息?有没有办法使用pd.to_datetime

Date
01-06-2013 23:00:00
02-06-2013 01:00:00
02-06-2013 21:00:00
02-06-2013 22:00:00
02-06-2013 23:00:00
03-06-2013 01:00:00
03-06-2013 21:00:00
03-06-2013 22:00:00
03-06-2013 23:00:00
04-06-2013 01:00:00

【问题讨论】:

    标签: python pandas datetime time-series


    【解决方案1】:

    值得一提的是,您可能已经能够直接阅读此内容,例如如果你使用read_csv 使用parse_dates=[['Date', 'Time']]

    假设这些只是字符串,您可以简单地将它们添加在一起(使用空格),允许您使用 to_datetime,无需指定 format= 参数即可使用

    In [11]: df['Date'] + ' ' + df['Time']
    Out[11]:
    0    01-06-2013 23:00:00
    1    02-06-2013 01:00:00
    2    02-06-2013 21:00:00
    3    02-06-2013 22:00:00
    4    02-06-2013 23:00:00
    5    03-06-2013 01:00:00
    6    03-06-2013 21:00:00
    7    03-06-2013 22:00:00
    8    03-06-2013 23:00:00
    9    04-06-2013 01:00:00
    dtype: object
    
    In [12]: pd.to_datetime(df['Date'] + ' ' + df['Time'])
    Out[12]:
    0   2013-01-06 23:00:00
    1   2013-02-06 01:00:00
    2   2013-02-06 21:00:00
    3   2013-02-06 22:00:00
    4   2013-02-06 23:00:00
    5   2013-03-06 01:00:00
    6   2013-03-06 21:00:00
    7   2013-03-06 22:00:00
    8   2013-03-06 23:00:00
    9   2013-04-06 01:00:00
    dtype: datetime64[ns]
    

    或者,不使用+ ' ',但必须使用format= 参数。此外,pandas 擅长推断要转换为 datetime 的格式,但是,指定确切的格式更快。

    pd.to_datetime(df['Date'] + df['Time'], format='%m-%d-%Y%H:%M:%S')
    

    注意:令人惊讶的是(对我来说),这在将 NaN 转换为 NaT 时效果很好,但值得担心的是转换(可能使用 raise 参数)。

    %%timeit

    # sample dataframe with 10000000 rows using df from the OP
    df = pd.concat([df for _ in range(1000000)]).reset_index(drop=True)
    
    %%timeit
    pd.to_datetime(df['Date'] + ' ' + df['Time'])
    [result]:
    1.73 s ± 10.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    
    %%timeit
    pd.to_datetime(df['Date'] + df['Time'], format='%m-%d-%Y%H:%M:%S')
    [result]:
    1.33 s ± 9.88 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    

    【讨论】:

      【解决方案2】:

      您还可以通过组合to_datetimeto_timedelta 来转换为不连接字符串的datetime,它们分别创建datetimetimedeltea 对象。结合pd.DataFrame.pop,可以同时移除源Series:

      df['DateTime'] = pd.to_datetime(df.pop('Date')) + pd.to_timedelta(df.pop('Time'))
      
      print(df)
      
                   DateTime
      0 2013-01-06 23:00:00
      1 2013-02-06 01:00:00
      2 2013-02-06 21:00:00
      3 2013-02-06 22:00:00
      4 2013-02-06 23:00:00
      5 2013-03-06 01:00:00
      6 2013-03-06 21:00:00
      7 2013-03-06 22:00:00
      8 2013-03-06 23:00:00
      9 2013-04-06 01:00:00
      
      print(df.dtypes)
      
      DateTime    datetime64[ns]
      dtype: object
      

      【讨论】:

      • 伟大的通用解决方案!我输入了 datetime date 和 type str time,这很有效。
      • 实际上这比接受的答案要快得多,特别是如果日期列已经是 pd.Timestamp 类型。
      【解决方案3】:

      如果类型不同(datetimetimestampstr),则转换列并使用to_datetime

      df.loc[:,'Date'] = pd.to_datetime(df.Date.astype(str)+' '+df.Time.astype(str))
      

      结果:

      0   2013-01-06 23:00:00
      1   2013-02-06 01:00:00
      2   2013-02-06 21:00:00
      3   2013-02-06 22:00:00
      4   2013-02-06 23:00:00
      5   2013-03-06 01:00:00
      6   2013-03-06 21:00:00
      7   2013-03-06 22:00:00
      8   2013-03-06 23:00:00
      9   2013-04-06 01:00:00
      

      最好的,

      【讨论】:

      • 这是我可以使用 Python datetime 模块类型的唯一选择。但是现在我将这份报告转换为datetime64[ns],这让我在其他地方遇到了混合类型,这绝不是一件好事。
      • 此选项与accepted answer 相比效率低下,因为两列已经是字符串。因此,使用 .astype(str) 是不必要的(给定 OP)。此外,df['Date'] = 就足够了;不需要.loc(例如df.loc[:,'Date'] =
      【解决方案4】:

      我认为最好的解决方案是直接解析 read_csv(或其他 read_ 函数)中的日期。如何在 date_parser 中管理两列并不明显,但这里是:

      date_parser = lambda x,y: datetime.strptime(f"{x}T{y}", "%d-%m-%YT%H:%M:%S")
      date = pd.read_csv('data.csv', parse_dates={'date': ['Date', 'Time']}, date_parser=date_parser)
      

      【讨论】:

        【解决方案5】:

        这是一个单一的班轮,做到这一点。您只需将每列中的两个字符串连接起来,并在它们之间用一个 " " 空格。

        假设 df 是您的数据框,列是“时间”和“日期”。您的新专栏是 DateAndTime。

        df['DateAndTime'] = df['Date'].str.cat(df['Time'],sep=" ")
        

        如果您还想处理日期时间对象等条目,您可以这样做。您可以根据需要调整格式。

        df['DateAndTime'] = pd.to_datetime(df['DateAndTime'], format="%m/%d/%Y %I:%M:%S %p")
        

        干杯!!快乐的数据处理。

        【讨论】:

          【解决方案6】:

          数据:

          ,,,,,,,, SPFB.RTS,1,20190103,100100,106580.0000000,107260.0000000,106570.0000000,107230.0000000,3726

          代码:

          data.columns = ['ticker', 'per', 'date', 'time', 'open', 'high', 'low', 'close', 'vol']    
          data.datetime = pd.to_datetime(data.date.astype(str) + ' ' + data.time.astype(str), format='%Y%m%d %H%M%S')
          

          【讨论】:

            【解决方案7】:

            我的数据集有几天的 1 秒分辨率数据,通过此处建议的方法进行解析非常慢。相反,我使用了:

            dates = pandas.to_datetime(df.Date, cache=True)
            times = pandas.to_timedelta(df.Time)
            datetimes  = dates + times
            

            请注意,cache=True 的使用使得解析日期非常有效,因为我的文件中只有几个唯一日期,这对于组合的日期和时间列不适用。

            【讨论】:

              【解决方案8】:

              答案实际上取决于您的列类型是什么。就我而言,我有datetimetimedelta

              > df[['Date','Time']].dtypes
              Date     datetime64[ns]
              Time    timedelta64[ns]
              

              如果这是您的情况,那么您只需要添加列:

              > df['Date'] + df['Time']
              

              【讨论】:

              • 接受的答案假设字符串:“假设这些只是字符串,您可以简单地将它们加在一起(带空格)”。我的答案是datetimetimedelta。主要答案以某种方式确定了这些列是字符串,或者可能只是对发布问题的人有用的答案。
              【解决方案9】:

              使用combine函数:

              datetime.datetime.combine(date, time)
              

              【讨论】:

                【解决方案10】:

                首先确保拥有正确的数据类型:

                df["Date"] = pd.to_datetime(df["Date"])
                df["Time"] = pd.to_timedelta(df["Time"])
                

                然后你很容易将它们组合起来:

                df["DateTime"] = df["Date"] + df["Time"]
                

                【讨论】:

                  【解决方案11】:

                  您可以使用它来将日期和时间合并到数据框的同一列中。

                  import pandas as pd    
                  data_file = 'data.csv' #path of your file
                  

                  读取包含合并列 Date_Time 的 .csv 文件:

                  data = pd.read_csv(data_file, parse_dates=[['Date', 'Time']]) 
                  

                  您也可以使用此行来保留其他两列。

                  data.set_index(['Date', 'Time'], drop=False)
                  

                  【讨论】:

                  • 也可以使用自定义date_parser,例如parser = lambda date: pd.datetime.strptime(date, '%d-%b-%y %H:%M:%S')
                  【解决方案12】:

                  我没有足够的声誉来评论 jka.ne 所以:

                  我必须修改 jka.ne's line 才能正常工作:

                  df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']).time(),1)
                  

                  这可能对其他人有所帮助。

                  另外,我测试了另一种方法,使用replace 而不是combine

                  def combine_date_time(df, datecol, timecol):
                      return df.apply(lambda row: row[datecol].replace(
                                                  hour=row[timecol].hour,
                                                  minute=row[timecol].minute),
                                      axis=1)
                  

                  在 OP 的情况下是:

                  combine_date_time(df, 'Date', 'Time')
                  

                  我已经为相对较大的数据集(>500.000 行)计时了这两种方法,它们都有相似的运行时间,但使用 combine 更快(replace 为 59 秒,combine 为 50 秒)。

                  【讨论】:

                    【解决方案13】:

                    接受的答案适用于数据类型为 string 的列。为了完整性:当列是数据类型时,我在搜索如何执行此操作时遇到了这个问题:日期和时间。

                    df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']),1)
                    

                    【讨论】:

                    • 我在 pandas 中找不到任何关于 time dtype 的信息。我有一个timedelta(和一个datetime),在这种情况下你只需要添加它们,see my answer
                    • 当我 'pd.read_excel' 一个 Excel 标识为“时间”的 Excel 列时,pandas 也会自动将其读取为“时间”,而无需任何解析参数。感谢您提供此解决方案。 +1
                    • 请注意,从 pandas 1.0.0 pd.datetime has been deprecated 开始,建议直接导入 datetime 模块。
                    • 这种方法对于大数据集来说太慢了。将两列都转换为字符串,加入它们并使用to_datetime 会更快。
                    猜你喜欢
                    • 2023-03-09
                    • 1970-01-01
                    • 2013-04-22
                    • 2021-12-15
                    • 1970-01-01
                    相关资源
                    最近更新 更多