Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于日期列编辑列_Python_Pandas - Fatal编程技术网

Python 基于日期列编辑列

Python 基于日期列编辑列,python,pandas,Python,Pandas,下面是一个数据帧示例 date_list = ['2014-01-01','2014-02-01','2014-03-01'] value_list = [100.00,98.00,102.00] df = pd.DataFrame({'DATE' : date_list, 'VALUE' : value_list}) 值列是每月总数,我想将其更改为每日平均数 我可以用这个逻辑来做: for x in range(len(df)): if str(df.ix[x,0])[5:7] in

下面是一个数据帧示例

date_list = ['2014-01-01','2014-02-01','2014-03-01']
value_list = [100.00,98.00,102.00]
df = pd.DataFrame({'DATE' : date_list, 'VALUE' : value_list})
列是每月总数,我想将其更改为每日平均数

我可以用这个逻辑来做:

for x in range(len(df)):
    if str(df.ix[x,0])[5:7] in ['01','03','05','07','08','10','12']:
        df.ix[x,1] = df.ix[x,1]/31
# etc. for other months
它可以工作,但需要太多时间。
如果我去,有更优雅的方式,我可以编辑一个列的基础上另一个 例如,df.ix[df.AAA>=5,'BBB']=-1。
但我不知道如何将它应用到我的案例中

如果将列转换为datetime,则可以使用dt访问器进行矢量化操作<例如,code>df['DATE'].dt.daysinmonth返回特定月份的天数

df['DATE'] = pd.to_datetime(df['DATE'])
df['VALUE'] / df['DATE'].dt.daysinmonth
Out: 
0    3.225806
1    3.500000
2    3.290323
dtype: float64
如何基于另一列编辑一列

第一步是将数据帧子集到要应用更改的行。为此,您创建一个布尔掩码,其中每行包含一个真/假值。True表示选中该行

mask = df['DATE'].map(lambda v: v[5:7] in ['01', '02', '03', '05', '07', '08', '10', '12'] 
然后应用遮罩并在一个步骤中更新值

df.loc[mask, 'VALUE'] /= 31
如果将“DATE”列转换为datetime值,代码将变得更加紧凑:

df['DATE'] = pd.to_datetime(df['DATE'])
df.loc[df.DATE.dt.month.isin([1, 2, 3, 5, 7, 8, 10, 12]), 'VALUE'] /= 31

熊猫将使用矢量化操作。将for循环与.loc变量进行比较,我的CPU性能提高了30%。

谢谢!那正是我要找的for@piRSquared谢谢。:)谢谢你的回答。这是我最初想到的语法
df['VALUE']/df['DATE'].dt.daysinmonth
似乎更快,当然,如果这是您想要的。我的回答是针对你的具体问题(引用)