【问题标题】:How to extract day and hour from a column in a DataFrame?如何从 DataFrame 的列中提取日期和小时?
【发布时间】:2019-10-14 05:35:53
【问题描述】:

我有一个数据框,其中有一列“日期”,其值类似于“10/9/2019 23:59”。我想创建两列:一列包含日期(“10/9/2019”),另一列包含小时(“23”)。

这是我的代码:

import pandas as pd
df = pd.read_csv('date.csv', names = ['Date'],
                 low_memory=False, encoding = 'utf-8-sig', header = 0)

cdf = pd.DataFrame(columns =['day' , 'hour'])
i = 0

for index, line in df.iterrows():
    day = datetime.strptime(str(df["Date"]), '%m/%d/%Y %H:%M').date()
    cdf.at[i , 'day'] = day
    hour = datetime.strptime(str(df["Date"]), '%m/%d/%Y %H:%M').hour
    cdf.at[i , 'hour'] = hour  
    i +=1

但我收到此错误:

ValueError                                Traceback (most recent call last)
<ipython-input-26-0550c19671cf> in <module>
      3 
      4 for line in dd:
----> 5     day = datetime.strptime(str(df["Date"]), '%m/%d/%Y %H:%M').date()
      6     cdf.at[i , 'day'] = day
      7     hour = datetime.strptime(str(df["Date"]), '%m/%d/%Y %H:%M').hour

~\AppData\Local\Continuum\anaconda3\lib\_strptime.py in _strptime_datetime(cls, data_string, format)
    575     """Return a class cls instance based on the input string and the
    576     format string."""
--> 577     tt, fraction, gmtoff_fraction = _strptime(data_string, format)
    578     tzname, gmtoff = tt[-2:]
    579     args = tt[:6] + (fraction,)

~\AppData\Local\Continuum\anaconda3\lib\_strptime.py in _strptime(data_string, format)
    357     if not found:
    358         raise ValueError("time data %r does not match format %r" %
--> 359                          (data_string, format))
    360     if len(data_string) != found.end():
    361         raise ValueError("unconverted data remains: %s" %

ValueError: time data '0        10/9/2019 23:59\n1        10/9/2019 23:59\n2        10/9/2019 23:59\n3        10/9/2019 23:59\n4        10/9/2019 23:59\n5        10/9/2019 23:59\n6        10/9/2019 23:59\n7        10/9/2019 23:59\n8        10/9/2019 23:59\n9        10/9/2019 23:59\n10       10/9/2019 23:59\n11       10/9/2019 23:59\n12       10/9/2019 23:59\n13       10/9/2019 23:59\n14       10/9/2019 23:59\n15       10/9/2019 23:59\n16       10/9/2019 23:58\n17       10/9/2019 23:58\n18       10/9/2019 23:58\n19       10/9/2019 23:58\n20       10/9/2019 23:58\n21       10/9/2019 23:58\n22       10/9/2019 23:58\n23       10/9/2019 23:58\n24       10/9/2019 23:58\n25       10/9/2019 23:58\n26       10/9/2019 23:58\n27       10/9/2019 23:58\n28       10/9/2019 23:58\n29       10/9/2019 23:58\n              ...       \n38584     10/7/2019 2:57\n38585     10/7/2019 2:43\n38586     10/7/2019 2:35\n38587     10/7/2019 2:33\n38588     10/7/2019 2:29\n38589     10/7/2019 2:22\n38590     10/7/2019 2:16\n38591     10/7/2019 2:01\n38592     10/7/2019 1:54\n38593     10/7/2019 1:52\n38594     10/7/2019 1:45\n38595     10/7/2019 1:42\n38596     10/7/2019 1:35\n38597     10/7/2019 1:30\n38598     10/7/2019 1:23\n38599     10/7/2019 1:23\n38600     10/7/2019 1:20\n38601     10/7/2019 1:15\n38602     10/7/2019 1:14\n38603     10/7/2019 1:13\n38604     10/7/2019 1:11\n38605     10/7/2019 1:05\n38606     10/7/2019 0:52\n38607     10/7/2019 0:42\n38608     10/7/2019 0:29\n38609     10/7/2019 0:19\n38610     10/7/2019 0:17\n38611     10/7/2019 0:14\n38612     10/7/2019 0:06\n38613     10/7/2019 0:02\nName: Date, Length: 38614, dtype: object' does not match format '%m/%d/%Y %H:%M'

这是我的数据的a link。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以通过这种方式轻松做到:

    示例框架:

                         Date      vals
    0      2000-01-01 00:00:00  0.000000
    1      2000-01-01 00:01:00  0.000031
    2      2000-01-01 00:02:00  0.000063
    3      2000-01-01 00:03:00  0.000094
    4      2000-01-01 00:04:00  0.000126
    

    请注意,Date 列位于datetime64[ns]。

    如果dates 是string 或object 或任何不是日期时间的dtype,您可以使用df["Date"] = pd.to_datetime(df["Date"]) 转换您的日期列

    df["day"] = df["Date"].dt.date
    df["hour"] = df["Date"].dt.hour
    

    【讨论】:

      【解决方案2】:

      在read_csv() 上,指定parse_dates='Date'。

      这样,您可以通过以下方式获取列:

      df['day'] = df['Date'].dt.date
      df['hour'] = df['Date'].dt.hour
      

      编辑1:

      意识到您在输入文件中没有标头。因此,您可以通过以下方式将日期列转换为日期时间,而不是在 read_csv() 上指定 parse_dates:

      df['Date'] = pd.to_datetime(df['Date'])
      

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2015-01-18
        • 2020-06-24
        • 1970-01-01
        • 1970-01-01
        • 2019-01-27
        • 2021-02-12
        • 1970-01-01
        • 2021-04-16
        • 1970-01-01
        相关资源
        最近更新 更多