如何根据日期有条件地设置数据框的值

时间:2014-07-15 14:23:12

标签: python datetime pandas comparison

我有一个带有几列数据的pandas数据帧,我正在传递给MSSQL。我的主键是一个文件名,它在2014年3月27日更改了格式。我在我的数据框中以编程方式创建了这个文件名,但我需要考虑这两个版本(一种格式在3月27日创建的文件之前和之后, 3月27日之后所有文件的其他文件。)

如何遍历每一行并有条件地设置我的文件名列?我的数据框中有一个datetime列,它具有正确的日期时间格式。我只是不知道如何比较更改日期,然后有条件地创建df [FileName]。

感谢@EdChum!

dateOfChange = datetime.date(2014, 03, 27)        

df.loc[df['DateTime'] > dateOfChange, 'FileName'] = df.BAC.map(str) + '_' + df.Year.map("{:04}".format, str) + df.Month.map("{:02}".format, str) + df.Day.map("{:02}".format, str) + df.Hour.map("{:02}".format, str) + df.Minute.map("{:02}".format, str) + df.Second.map("{:02}".format, str) + "_" + df.NumberDialed.map(str)
df.loc[df['DateTime'] <= dateOfChange, 'FileName'] = df.BAC.map(str) + '_' + df.Year.map("{:04}".format, str) + df.Month.map("{:02}".format, str) + df.Day.map("{:02}".format, str) + df.Hour.map("{:02}".format, str) + df.Minute.map("{:02}".format, str) + df.Second.map("{:02}".format, str)

1 个答案:

答案 0 :(得分:2)

您可以只过滤要分配的行,而不是迭代,而是分配给所有行。这将更快,并利用熊猫的力量:

df.loc[df['DateTime'] > dateOfChange, 'FileName'] = someVal
df.loc[df['DateTime'] <= dateOfChange, 'FileName'] = otherVal

我们在此处使用loc执行标签索引,请参阅文档:http://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label