【问题标题】:How can I split a DataFrame column with datetimes into two columns: one with dates and one with times of the day?如何将包含日期时间的 DataFrame 列拆分为两列:一列包含日期,另一列包含一天中的时间?
【发布时间】:2016-06-02 23:38:17
【问题描述】:

我有一个名为data 的数据框,其中有一列Dates 像这样,

                 Dates
0  2015-05-13 23:53:00
1  2015-05-13 23:53:00
2  2015-05-13 23:33:00
3  2015-05-13 23:30:00
4  2015-05-13 23:30:00

我知道如何向数据框添加一列,但是如何将Dates 划分为

          Day         Time
0  2015-05-13     23:53:00
1  2015-05-13     23:53:00
2  2015-05-13     23:33:00
3  2015-05-13     23:30:00
4  2015-05-13     23:30:00

【问题讨论】:

  • “日期”是什么类型的数据? df.Dates.iat[0] 的输出是什么?

标签: python pandas datetime dataframe series


【解决方案1】:

如果你的系列是s,那么这将创建这样一个DataFrame:

pd.DataFrame({
    'date': pd.to_datetime(s).dt.date,
    'time': pd.to_datetime(s).dt.time})

因为一旦您使用pd.to_datetime 转换系列,则可以使用dt 成员来提取部分。


示例

import pandas as pd

s = pd.Series(['2015-05-13 23:53:00', '2015-05-13 23:53:00'])
>>> pd.DataFrame({
    'date': pd.to_datetime(s).dt.date,
    'time': pd.to_datetime(s).dt.time})
    date    time
0   2015-05-13  23:53:00
1   2015-05-13  23:53:00

【讨论】:

  • 您可以将时间列值保存为 12 小时格式而不是 24 小时格式吗???
  • @sanster9292 见this
  • 阿米,我不太擅长这个。我有一个看起来像这样的熊猫列中的数据。 1999-01-01T00:00:29.75 我想拆分并保存它和东部夏令时间。我将如何处理那里的T?这就是我目前正在做的事情,
  • df3['Day']=pd.to_datetime(df['Date'], format='%Y-%m-%d %H:%M:%S.%f', errors='coerce').dt.tz_localize('UTC')
  • @sanster9292 你能问这个问题吗?评论不适用于这些东西。很多人会帮助你。
【解决方案2】:

如果您的 Dates 列是字符串:

data['Day'], data['Time'] = zip(*data.Dates.str.split())

>>> data
                 Dates         Day      Time
0  2015-05-13 23:53:00  2015-05-13  23:53:00
1  2015-05-13 23:53:00  2015-05-13  23:53:00
2  2015-05-13 23:33:00  2015-05-13  23:33:00
3  2015-05-13 23:33:00  2015-05-13  23:33:00
4  2015-05-13 23:33:00  2015-05-13  23:33:00

如果是时间戳:

data['Day'], data['Time'] = zip(*[(d.date(), d.time()) for d in data.Dates])

【讨论】:

    【解决方案3】:

    如果Dates 的列类型为字符串,则将其转换为to_datetime。然后你可以使用dt.datedt.time和最后一个drop原始列Dates

    print df['Dates'].dtypes
    object
    print type(df.at[0, 'Dates'])
    <type 'str'>
    
    df['Dates'] = pd.to_datetime(df['Dates'])
    
    print df['Dates'].dtypes
    datetime64[ns]
    
    print df
                    Dates
    0 2015-05-13 23:53:00
    1 2015-05-13 23:53:00
    2 2015-05-13 23:33:00
    3 2015-05-13 23:30:00
    4 2015-05-13 23:30:00
    
    df['Date'] = df['Dates'].dt.date
    df['Time'] = df['Dates'].dt.time
    
    df = df.drop('Dates', axis=1)
    print df
             Date      Time
    0  2015-05-13  23:53:00
    1  2015-05-13  23:53:00
    2  2015-05-13  23:33:00
    3  2015-05-13  23:30:00
    4  2015-05-13  23:30:00
    

    【讨论】:

      【解决方案4】:

      attrgetter + pd.concat + join

      您可以使用operator.attrgetterpd.concat 将任意数量的datetime 属性作为单独的系列添加到您的数据框:

      from operator import attrgetter
      
      fields = ['date', 'time']
      df = df.join(pd.concat(attrgetter(*fields)(df['Date'].dt), axis=1, keys=fields))
      
      print(df)
      
                       Date        date      time
      0 2015-05-13 23:53:00  2015-05-13  23:53:00
      1 2015-01-13 15:23:00  2015-01-13  15:23:00
      2 2016-01-13 03:33:00  2016-01-13  03:33:00
      3 2018-02-13 20:13:25  2018-02-13  20:13:25
      4 2017-05-12 06:52:00  2017-05-12  06:52:00
      

      【讨论】:

        猜你喜欢
        • 2021-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多