【问题标题】:Adding a specified value to each in a pandas data frame为熊猫数据框中的每个添加一个指定的值
【发布时间】:2017-10-10 19:36:30
【问题描述】:

我正在迭代可用的行,但这似乎不是最理想的方法——它需要很长时间。

Pandas 中是否有特殊的方法可以做到这一点。

INIT_TIME = datetime.datetime.strptime(date + ' ' + time, "%Y-%B-%d %H:%M:%S")
#NEED TO ADD DATA FROM THAT COLUMN

df = pd.read_csv(dataset_path, delimiter=',',skiprows=range(0,1),names=['TCOUNT','CORE','COUNTER','EMPTY','NAME','TSTAMP','MULT','STAMPME'])
df = df.drop('MULT',1)
df = df.drop('EMPTY',1)
df = df.drop('TSTAMP', 1)
for index, row in df.iterrows():
    TMP_TIME = INIT_TIME + datetime.timedelta(seconds=row['TCOUNT'])
    df['STAMPME'] = TMP_TIME.strftime("%s")

另外,我添加的日期时间格式如下

2017-05-11 11:12:37.100192 1494493957
2017-05-11 11:12:37.200541 1494493957

因此 unix 时间戳是相同的(而且是正确的),但是有没有更好的方法来表示它?

【问题讨论】:

    标签: python pandas datetime time


    【解决方案1】:

    假设日期时间正确反映了您正在尝试做的事情,那么对于 Pandas,您应该能够做到:

    df['STAMPME'] = df['TCOUNT'].apply(lambda x: (datetime.timedelta(seconds=x) + INIT_TIME).strftime("%s"))
    

    here 所述,您不应使用 iterrows() 来修改您正在迭代的 DF。如果您需要逐行迭代(而不是使用 apply 方法),您可以使用另一个数据对象,例如一个列表,以保留您正在计算的值,然后从中创建一个新列。

    此外,为了将来参考,itertuples() 方法比 iterrows() 方法更快,尽管它需要您知道每列的索引(即 row[x] 而不是 row['name'])。

    【讨论】:

    【解决方案2】:

    我会这样重写你的代码

    INIT_TIME = datetime.datetime.strptime(date + ' ' + time, "%Y-%B-%d %H:%M:%S")
    INIT_TIME = pd.to_datetime(INIT_TIME)
    
    df = pd.read_csv(
        dataset_path, delimiter=',',skiprows=range(0,1),
        names=['TCOUNT','CORE','COUNTER','EMPTY','NAME','TSTAMP','MULT','STAMPME']
    )
    df = df.drop(['MULT', 'EMPTY', 'TSTAMP'], 1)
    df['STAMPME'] = pd.to_timedelta(df['TCOUNT'], 's') + INIT_TIME
    

    【讨论】:

    • 谢谢。那个时间戳问题怎么样。您对此有何看法?
    • @tandem 将添加的是熊猫时间戳。它们看起来会有所不同,并且属于日期类型。不太清楚你在问什么。
    • df['STAMPME'] = pd.to_timedelta(df['TCOUNT'], 's') + INIT_TIME 的计算不会产生 unix 时间戳
    猜你喜欢
    • 2016-02-13
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多