Python 我是不是在循环方面做错了什么?

Python 我是不是在循环方面做错了什么?,python,data-cleaning,Python,Data Cleaning,我正在使用python进行一些数据清理,我使用datetime模块分割日期时间,并尝试创建另一个只包含时间的列 我的脚本可以工作,但它只接受数据帧的最后一个值 代码如下: import datetime i = 0 for index, row in df.iterrows(): date = datetime.datetime.strptime(df.iloc[i, 0], "%Y-%m-%dT%H:%M:%SZ") df['minutes'] = date.minute

我正在使用python进行一些数据清理,我使用datetime模块分割日期时间,并尝试创建另一个只包含时间的列

我的脚本可以工作,但它只接受数据帧的最后一个值

代码如下:

import datetime

i = 0
for index, row in df.iterrows():
    date = datetime.datetime.strptime(df.iloc[i, 0], "%Y-%m-%dT%H:%M:%SZ")
    df['minutes'] = date.minute 
    i = i + 1
这是数据帧:

df['minutes']=date.minute使用上一次迭代的标量值date.minute重新分配整个'minutes'列

你不需要一个循环,因为99%的情况下使用熊猫

您可以使用矢量化赋值,只需将“source\u column\u name”替换为具有源数据的列的名称即可

df['minutes'] = pd.to_datetime(df['source_column_name'], format='%Y-%m-%dT%H:%M:%SZ').dt.minute
您也很可能不需要将格式指定为pd。to_datetime相当智能

快速示例:

df = pd.DataFrame({'a': ['2020.1.13', '2019.1.13']})
df['year'] = pd.to_datetime(df['a']).dt.year
print(df)
输出

           a  year
0  2020.1.13  2020
1  2019.1.13  2019
df['minutes']=date.minute使用上一次迭代的标量值date.minute重新分配整个'minutes'列

你不需要一个循环,因为99%的情况下使用熊猫

您可以使用矢量化赋值,只需将“source\u column\u name”替换为具有源数据的列的名称即可

df['minutes'] = pd.to_datetime(df['source_column_name'], format='%Y-%m-%dT%H:%M:%SZ').dt.minute
您也很可能不需要将格式指定为pd。to_datetime相当智能

快速示例:

df = pd.DataFrame({'a': ['2020.1.13', '2019.1.13']})
df['year'] = pd.to_datetime(df['a']).dt.year
print(df)
输出

           a  year
0  2020.1.13  2020
1  2019.1.13  2019

似乎您正试图从字符串格式的datetime中获取时间列。这是我从你的帖子中了解到的。 你能试一试吗

from datetime import datetime
import pandas as pd

def get_time(date_cell):
    dt = datetime.strptime(date_cell, "%Y-%m-%dT%H:%M:%SZ")
    return datetime.strftime(dt, "%H:%M:%SZ")

df['time'] = df['date_time'].apply(get_time)

似乎您正试图从字符串格式的datetime中获取时间列。这是我从你的帖子中了解到的。 你能试一试吗

from datetime import datetime
import pandas as pd

def get_time(date_cell):
    dt = datetime.strptime(date_cell, "%Y-%m-%dT%H:%M:%SZ")
    return datetime.strftime(dt, "%H:%M:%SZ")

df['time'] = df['date_time'].apply(get_time)